opencv+opencl c++程序移植心酸路
2017-05-21 13:41
531 查看
因为想要再其他两个节点运行该程序,所以踏上不归路。
1. 编译环境相同
2. ffmpeg版本相同 (在用apt-get直接下载ffmpeg的时候,默认下载最新版的ffmpeg,当我用-version = xxxx指定版本的时候,因为添加的repository已经更新了,所以无法找到老版本的ffmpeg.)
3. opencv版本相同
4. cuda版本相同
其中
pkg-config命令的结果是:
-I 是头文件
-L是路径,-l是lib包。
如果运行那个不负责任的版本,会报错:找不到“-lxxx”,因为其中一些lib包只有动态.so文件,没有静态.a文件, 全部静态编译是行不通的。
第二个版本:(静态;动态分开编译)
有点乱…主要是利用
分开编译。强烈推荐“–verbose”option,可以帮助排错。
这个方法不可以使程序完全可移植,因为有大部分还是动态编译的。
可以利用
来查询你的可执行文件所有依赖的库
可查询unused(没有用的)依赖的库
方法一 在每个节点配置相同环境
在其他节点配置的环境必须要与原机的环境完全相同。这里包括: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(没有用的)依赖的库
相关文章推荐
- 将gcc下的程序移植到MSVC下 之一 - gcc对标准C/C++语言的扩展
- 编写可移植C/C++程序要点
- 编写可移植C/C++程序的要点
- 利用Boost实现高度可移植的多线程C++程序
- 32位C/C++程序移植到64位系统时需要注意的问题
- 如何编写易于移植的C++ 程序
- 编写可移植C/C++程序的要点
- 编写可移植C/C++程序要点
- 编写可移植C/C++程序要点
- [待总结]软件移植:C++程序从windows移植到linux
- 编写可移植C/C++程序的要点
- [泛读]C++程序跨平台、多线程支持和x64移植问题
- 编写可移植C/C++程序的要点
- android中移植 c/c++程序
- 编写可移植C/C++程序的要点
- 编写可移植C/C++程序的要点
- 编写可移植C/C++程序的要点
- 编写可移植C/C++程序的要点
- c/C++移植程序
- aix 使用g++编译c++程序的编译选项 -- linux到aix移植经验