OpenCV 靜態連接 libstdc++

爲了讓依賴於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

相關文章
相關標籤/搜索