博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenCV 静态链接 libstdc++
阅读量:5050 次
发布时间:2019-06-12

本文共 2087 字,大约阅读时间需要 6 分钟。

为了让依赖于opencv编译出的so库带有尽量少的依赖, 我们需要将opencv编译成静态库(.a), 比如用下面的命令使用cmake:

mkdir buildcd buildcmake -D WITH_IPP=OFF -D CMAKE_BUILD_TYPE=RELEASE -D BUILD_SHARED_LIBS=OFF ..make -j4sudo make install

但此时的问题是, 这样虽然去掉了opencv相关动态so库的依赖, 但依赖这个opencv静态库编译出的so仍然带有glibc的强依赖, 比如ldd xxx.so得到结果:

linux-vdso.so.1 =>  (0x00007ffefcd33000)    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f390b6d2000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f390b4bc000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f390b0f1000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f390aed4000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f390abcb000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f390a9c6000) librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f390a7be000) /lib64/ld-linux-x86-64.so.2 (0x0000560df4951000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f3909428000)

注意libstdc++.so.6, 和 libgcc_s.so.1, 我们需要去掉这两项的依赖.

经过多种尝试, 发现, opencv编译好之后, 别的项目中引用opencv, 会引用opencv的相关配置, 而opencv的相关配置中, 带有 -lstdc++, 这样, 总会带有stdc++的动态依赖. 我的办法是安装好opencv之后, 直接修改opencv安装完成之后的配置文件.

我们可以这样找:

grep -ir "stdc++" /usr/local/share

在我的release安装中, 应当修改:

sudo vi /usr/local/share/OpenCV/OpenCVModules-release.cmake

比如可以看到一系列类似如下的行:

IMPORTED_LINK_INTERFACE_LIBRARIES_RELEASE "opencv_core;opencv_imgproc;stdc++;dl;m;pthread;rt"

把这个文件中所有的stdc++改为-static-libstdc++即可.

然后我们编译自己的不管是so库也好, 可执行文件也好, ldd之后结果为:

 
linux-vdso.so.1 =>  (0x00007ffec0fc6000)    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fb6f47f9000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fb6f45f5000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb6f43d7000) librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fb6f41cf000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb6f3ec6000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb6f3afb000) /lib64/ld-linux-x86-64.so.2 (0x000055f9e5f86000)

这样, 就去掉了上述两个强依赖的so库. 在linux机器之间拷贝也就少了很多依赖麻烦.

这里zlib仍然是动态链接的, 如果有时间还可以把zlib的依赖也去掉.

转载于:https://www.cnblogs.com/xinshijue6080/p/7683947.html

你可能感兴趣的文章
Linux 系统的/var目录
查看>>
Redis学习---Redis操作之其他操作
查看>>
WebService中的DataSet序列化使用
查看>>
BZOJ 1200 木梳
查看>>
【Linux】【C语言】菜鸟学习日志(一) 一步一步学习在Linxu下测试程序的运行时间...
查看>>
hostname
查看>>
SpringBoot使用其他的Servlet容器
查看>>
关于cookie存取中文乱码问题
查看>>
k8s架构
查看>>
select 向上弹起
查看>>
mysql 多表管理修改
查看>>
group by order by
查看>>
bzoj 5252: [2018多省省队联测]林克卡特树
查看>>
https 学习笔记三
查看>>
Oracle学习之简单查询
查看>>
log4j配置
查看>>
linux 配置SAN存储-IPSAN
查看>>
双链表
查看>>
java学习笔记之String类
查看>>
pymysql操作mysql
查看>>