博主在Ubuntu 15.10 下安装Caffe时需要编译OpenCV 2.4.9,前期已经安装好CUDA 7.5和 cuDNN v4,显卡是NVIDIA TITAN X。Linux下OPenCV的编译安装网上有很多教程,本文主要是总结实际安装过程中出现的问题和解决方法。
$ sudo apt-get install cmake
$ sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff4.dev libswscale-dev libjasper-dev
从官网下载opencv并解压,cd命令进入opencv的目录:
$ unzip OpenCV-2.4.9.zip
$ cd opencv-2.4.9
$ mkdir build
$ cd build
$ cmake ..
$ sudo make -j4
$ sudo make install
将opencv的库加入到路径,从而让系统可以找到:
$ sudo gedit /etc/ld.so.conf.d/opencv.conf
末尾加入/usr/local/lib,保存退出。
$ sudo ldconfig #使配置生效
打开/etc/bash.bashrc;
$ sudo gedit /etc/bash.bashrc
在文件末尾加入:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
保存退出
$ sudo source /etc/bash.bashrc #使配置生效
$ sudo updatedb #更新database
打开opencv2.4.9目录下的opencv-2.4.9/samples/c,运行build_all.sh脚本
# build
./build_all.sh
使用下面的一个sample进行测试
./pyramid_segmentation
Github上有人已经写好了完整的安装脚本:https://github.com/jayrambhia/Install-OpenCV
下载该脚本,进入Ubuntu/2.4 目录, 给所有shell脚本加上可执行权限
chmod +x *.sh
然后安装最新版本 (当前为2.4.9)
sudo ./opencv2_4_9.sh
【参考1】http://www.cnblogs.com/platero/p/3993877.html
问题描述:
使用cmake生成Makefile文件以及make的过程中,报如下错误:
nvcc fatal : Unsupported gpu architecture 'compute_11'
CMake Error at cuda_compile_generated_matrix_operations.cu.o.cmake:206 (message):
Error generating
/home/smie/Documents/opencv2.4.11/build/modules/core/CMakeFiles/cuda_compile.dir/__/dynamicuda/src/cuda/./cuda_compile_gene
rated_matrix_operations.cu.o
make[2]: ***
[modules/core/CMakeFiles/cuda_compile.dir/__/dynamicuda/src/cuda/./cuda_compile_generated_matrix_operations.cu.o] Error 1
make[1]: *** [modules/core/CMakeFiles/opencv_core.dir/all] Error 2 make[1]: *** Waiting for unfinished jobs.…
这是因为Titan显卡(包括GTX 900系列)的架构是比较新的Maxwell架构,应该在cmake 参数命令中增加 -D CUDA_GENERATION=Kepler
虽然Kepler架构是Maxwell架构的上一代,但是这样配置也可以成功。
完整的cmake命令如下
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D CUDA_GENERATION=Kepler ..
【参考2】http://blog.csdn.net/sysuwuhongpeng/article/details/45485719
问题描述:
make过程中链接错误:
Linking CXX executable ../../bin/opencv_perf_core
../../lib/libopencv_highgui.so.2.4.5: undefined reference to `png_set_longjmp_fn'
collect2: ld 返回 1
make[2]: *** [bin/opencv_perf_core] 错误 1
make[1]: *** [modules/core/CMakeFiles/opencv_perf_core.dir/all] 错误
分析:
经查,与编译libopencv_highgui.so.2.4.5时参数有关,修改编译pencv_perf_core的文件
/home/wjq/Documents/opencv/opencv-2.4.9/build/modules/imgproc/CmakeFiles/opencv_perf_imgproc.dir/link.txt
都增加或改为:-lpng /usr/local/lib/libpng16.so
该错误解决。
原因:
系统中libpng.so库有不同版本,指定使用libpng16.so
【参考3】http://gaodr.blog.163.com/blog/static/10461500820134824949883/
在编译过程中,可能会中途报错:
opencv-2.4.9/modules/gpu/src/nvidia/core/NCVPixelOperations.hpp(51): error: a storage class is not allowed in an explicit specialization
需要使用下载NCVPixelOperations.hpp替换掉opencv2.4.9内的文件, 重新build。
因为某些原因,上述链接已经失效,我将会上传.hpp文件:
NCVPixelOperations.hpp 修改bug
http://download.csdn.net/detail/solomon1558/9581114
【参考4】http://code.opencv.org/issues/3814
问题描述:
build过程中找不到动态连接库/usr/bin/ld: cannot find -lcufft在测试过程中./build_all.sh报如下错误:
collect2: error: ld returned 1 exit status
compiling tree_engine.cpp
/usr/bin/ld: cannot find -lcufft
/usr/bin/ld: cannot find -lnpps
/usr/bin/ld: cannot find -lnppi
/usr/bin/ld: cannot find -lnppc
/usr/bin/ld: cannot find -lcudart
collect2: error: ld returned 1 exit status
问题分析:
linux下编译应用程序常常会出现如下错误:
/usr/bin/ld: cannot find -lxxx
一般出现这种错误有以下几种原因:
1.系统缺乏对应的库文件;
2.版本不对应;
3.库文件的链接错误;
4.库文件路径设置问题;
对应第一第二种情况,可以通过下载安装lib来解决,ubuntu大多数可以直接通过apt-get来安装:
apt-get install libxxx-dev
一般遇到这种问题笔者第一时间也是会去检查系统是否已安装该lib或者是否已选择正确版本(只是习惯问题),如果还是不能解决问题,那么,引起错误的原因不是链接错误就是库文件路径问题了。
通过find或者locate指令定位到链接文件,查看链接文件是否正确的指向了我们希望的lib,如果不是,用 ln -sf /libxxx.so.x /libxxx.so 指令修改它。
root@wjq-NUDT:/home/wjq/Documents/opencv/opencv-2.4.9/samples/c# find / -name libcufft.so
/usr/lib/libcufft.so
/usr/local/cuda-7.5/lib64/libcufft.so
/usr/local/cuda-7.5/lib64/stubs/libcufft.so
如果是库文件路径引发的问题,可以到/etc/ld.so.conf.d目录下,修改其中任意一份conf文件
root@wjq-NUDT:~# gedit /etc/ld.so.conf.d/opencv.conf
然后ldconfig命令更新报错共享库路径的ld.so.cache
root@wjq-NUDT:~# ldconfig
然而笔者在opencv.conf配置文件中添加cuda的链接库路径后,仍然无法正确编译。后来直接将cuda/lib64中相应的动态看cp到/usr/lib中,在编译的时候系统自动搜索该路径下的动态链接库。注意cp -a属性表示”保留原文件属性的前提下复制文件”,包括“动态链接库之间的软连接关系”。
# cp -a libcufft.so* /usr/lib/
# cp -a libnpps.so* /usr/lib/
# cp -a libnppi.so* /usr/lib/
# cp -a libnppc.so* /usr/lib/
至此,在Linux 下编译OpenCV成功。
./pyramid_segmentation
[1] 普兒的技术传送门.Caffe + Ubuntu 14.04 64bit + CUDA 6.5 配置说明
http://www.cnblogs.com/platero/p/3993877.html
[2] sysuwuhongpeng的博客.Unsupported gpu architecture ‘compute_11’解决方法
http://blog.csdn.net/sysuwuhongpeng/article/details/45485719
[3] gaodr的博客.opencv编译问题及解决方法
http://gaodr.blog.163.com/blog/static/10461500820134824949883/
[4]OpenCV DevZone. OpenCV isn’t compatible with CUDA 6.5 (Bug #3814)
http://code.opencv.org/issues/3814