您的位置:首页 > 编程语言 > C语言/C++

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

2017-05-21 13:41 531 查看
因为想要再其他两个节点运行该程序,所以踏上不归路。

方法一 在每个节点配置相同环境

在其他节点配置的环境必须要与原机的环境完全相同。这里包括:

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(没有用的)依赖的库
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv