为了让依赖于opencv编译出的so库带有尽可能少的依赖, 咱们须要将opencv编译成静态库(.a), 好比用下面的命令使用cmake:linux
mkdir build cd build cmake -D WITH_IPP=OFF -D CMAKE_BUILD_TYPE=RELEASE -D BUILD_SHARED_LIBS=OFF .. make -j4 sudo make install
但此时的问题是, 这样虽然去掉了opencv相关动态so库的依赖, 但依赖这个opencv静态库编译出的so仍然带有glibc的强依赖, 好比ldd xxx.so
获得结果:c++
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, 咱们须要去掉这两项的依赖.bash
通过多种尝试, 发现, opencv编译好以后, 别的项目中引用opencv, 会引用opencv的相关配置, 而opencv的相关配置中, 带有 -lstdc++
, 这样, 总会带有stdc++的动态依赖. 个人办法是安装好opencv以后, 直接修改opencv安装完成以后的配置文件.
咱们能够这样找:ui
grep -ir "stdc++" /usr/local/share
在个人release安装中, 应当修改:3d
sudo vi /usr/local/share/OpenCV/OpenCVModules-release.cmake
好比能够看到一系列相似以下的行:code
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的依赖也去掉.opencv