opencv+opencl c++程序移植心酸路

因爲想要再其他兩個節點運行該程序,所以踏上不歸路。

方法一 在每個節點配置相同環境

在其他節點配置的環境必須要與原機的環境完全相同。這裏包括:
1. 編譯環境相同
2. ffmpeg版本相同 (在用apt-get直接下載ffmpeg的時候,默認下載最新版的ffmpeg,當我用-version = xxxx指定版本的時候,因爲添加的repository已經更新了,所以無法找到老版本的ffmpeg.)
3. opencv版本相同
4. cuda版本相同

程序編譯時添加靜態庫

一個不負責任的版本是這樣:

g++ -static -Wl,--as-needed -o output function.cpp gaussian.cpp `pkg-config --static --cflags --libs opencv`

其中

-static //靜態編譯option
-Wl,--as-needed //只需編譯需要的。
`pkg-config --static --cflags --libs opencv`

pkg-config命令的結果是:

-I/usr/local/include/opencv -I/usr/local/include -I/usr/local/cuda-8.0/include -L/usr/local/lib -L/usr/local/cuda/lib64 -L/usr/local/share/OpenCV/3rdparty/lib -lopencv_cudabgsegm -lopencv_cudaobjdetect -lopencv_cudastereo -lopencv_shape -lopencv_stitching -lopencv_cudafeatures2d -lopencv_superres -lopencv_cudacodec -lopencv_videostab -lopencv_cudaoptflow -lopencv_cudalegacy -lopencv_calib3d -lopencv_features2d -lopencv_objdetect -lopencv_highgui -lopencv_videoio -lopencv_photo -lopencv_imgcodecs -lopencv_cudawarping -lopencv_cudaimgproc -lopencv_cudafilters -lopencv_video -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_cudaarithm -lopencv_core -lopencv_cudev -llibjpeg -llibwebp -llibtiff -llibjasper -lIlmImf -lippicv -lQtOpenGL -lQtGui -lQtTest -lQtCore -lpng -lz -lgstbase-1.0 -lgstreamer-1.0 -lgobject-2.0 -lglib-2.0 -lgstvideo-1.0 -lgstapp-1.0 -lgstriff-1.0 -lgstpbutils-1.0 -lavcodec-ffmpeg -lavformat-ffmpeg -lavutil-ffmpeg -lswscale-ffmpeg -lstdc++ -ldl -lm -lpthread -lrt -lGLU -lGL -lcudart -lnppc -lnppi -lnpps -lcublas -lcufft -lOpenCL

-I 是頭文件
-L是路徑,-l是lib包。
如果運行那個不負責任的版本,會報錯:找不到“-lxxx”,因爲其中一些lib包只有動態.so文件,沒有靜態.a文件, 全部靜態編譯是行不通的。

第二個版本:(靜態;動態分開編譯)

g++ -v -Wl,--as-needed -o output function.cpp gaussian.cpp -I/usr/local/cuda-8.0/include -I/usr/local/include -I/usr/local/include/opencv -I/usr/local/include/opencv2 -I/usr/include -I/usr/include/x86_64-linux-gnu -Wl,--as-needed -Wl,-Bdynamic -L/usr/lib/x86_64-linux-gnu -ldl -L/lib/x86_64-linux-gnu -L/usr/local/cuda/lib64 -L/usr/local/share/OpenCV/3rdparty/lib -llibjpeg -llibwebp -llibtiff -llibjasper -lIlmImf -lippicv -lQtOpenGL -lQtGui -lQtTest -lQtCore -lpng -lz -lgstbase-1.0 -lgstreamer-1.0 -lgobject-2.0 -lglib-2.0 -lgstvideo-1.0 -lgstapp-1.0 -lgstriff-1.0 -lgstpbutils-1.0 -lavcodec-ffmpeg -lavformat-ffmpeg -lavutil-ffmpeg -lswscale-ffmpeg -lstdc++ -lm -lpthread -lrt -lGLU -lGL -lcudart -lnppc -lnppi -lnpps -lcublas -lcufft -lOpenCL -Wl,-Bstatic -L/usr/local/lib -lopencv_ml -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_imgcodecs -Wl,-R/usr/local/lib/ -Wl,-R/usr/lib/ -Wl,-R/usr/local/ -Wl,--verbose

有點亂…主要是利用

-Wl,-Bdynamic 動態包 -Wl, -Bstatic 靜態包

分開編譯。強烈推薦“–verbose”option,可以幫助排錯。
這個方法不可以使程序完全可移植,因爲有大部分還是動態編譯的。

複製所有動態lib

因爲上個方法,大部分還是動態編譯的,不如就用最笨的辦法,把所有的動態lib添加到程序運行路徑下咯。
可以利用

ldd 可執行文件名稱

來查詢你的可執行文件所有依賴的庫

ldd -u 可執行文件名稱

可查詢unused(沒有用的)依賴的庫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章