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(没有用的)依赖的库

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