公司项目中用到了opencv,但是当时项目比较着急,因此同事直接给了编译好的opencv的库,自己并没有尝试从头去编译,项目结束后有点时间,于是自己尝试去从头交叉编译opencv,现在把过程记录一下,后面再需要对OpenCV别的版本进行交叉编译的时候可以直接看自己的笔记。
环境
PC:vmware + ubuntu18.04
交叉编译工具链:arm_hisiv300_linux(HISI3536的交叉编译工具)
opencv版本:opencv-2.4.9.zip
交叉编译
下载opencv2.4.9源码,然后解压,
安装cmake-gui
1 sudo apt-get install cmake-gui
创建build文件用于编译opencv,创建install文件夹作为输出目录
1 cd opencv-2.4.9 2 mkdir build 3 mkdir install
然后执行cmake-gui,出现如下界面
选择source code为opencv2.4.9的路径,选择build the binaries为我们刚才新创建的build文件夹。
然后点击configure出现如下画面
选择specify options for cross-compiling,next,然后出现如下界面。
在operating system填写arm-hisiv300-linux,
Compiler C选择自己的arm-hisiv300-linux-gcc的路径,
C++编译器选择arm-hisiv300-linux-g++的安装路径,
Target root选择自己的交叉交叉编译工具所在的文件夹,并且选择search in Target root ,then native system.
然后点击configure,这时候会出现error inconfiguration process,project files may be invalid.
解决方法是在search中搜索CUDA,把WITH_CUDA取消掉,搜索opencl把WITH_OPENCL去掉,再次选择就不会出现问题。
在search中搜索install,把CMAKE_INSTALL_PREFIX修改为自己刚才创建的install文件夹,
如果想让我们编译出来的opencv库为静态链接库的话,可以在search里面搜索shared,把BUILD_SHARED_LIBS去掉,这样编译出来的opencv库就是.a结尾的静态链接库了。
另外,configure的过程中可能还会有下面的提示
然后很多编译opencv的博客教程在编译opencv的时候会有一步: 从网上zlib、libjpeg、libpng、tiff、ffmjpeg的源码,然后对这几个库的源码进行交叉编译,实际上不用这样做,我们下载的opencv源码里面有这几个库的源码,我们只需要在cmake-gui上把相应的选项选上,这样编译opencv的过程中会把这个库编译出来(第三方库生成在build3rdpartylib),例如
这样之后就能产生jpeg库了,同样的方法可以编译zlib等其他几个库,
然后点击generate,然后就可以关闭cmake_gui了,
然后开始编译
1 cd build/ 2 make
编译的过程中会报对pthread_once未定义的引用,对pthread_spin_lock未定义的引用等错误,
解决方法:打开build文件夹下的CMakeCache.txt,定位到190行左右,把CMAKE_EXE_LINKER_FLAGS:STRING =改为CMAKE_EXE_LINKER_FLAGS:STRING = -pthread -lrt
然后make
然后make install
这样就会在install文件夹下生成opencv库,在install的share-3rdparty文件夹下会生成zlib jpeg等几个库。
测试验证
编译完opencv之后想在项目中对自己编译完的OpenCV库进行验证,出现错误,
刚开始觉得是自己编译的opencv存在问题,于是一遍又一遍的从头编译,问题依然存在,差点要重新安装了ubuntu14版本重新编译,直到搜索到下面的答案
原来是因为imgproc是依赖于core的,被依赖的库要放到后面,于是修改自己的makefile,把-loencv_core放到了-lopencv_imgproc的后面,于是编译通过,程序测试运行通过.
success!
补充:有一次在HI3559A上要用opencv,把库编译出来加到工程里面编译的时候提示很多未定义,这时候把-lopencv_imgcodecs -lopencv_imgproc 放到最前面就好了,就是因为这两个库依赖core库,所以要把它们放到core库前面。