PC系统:Ubuntu
ARM开发板:Tiny210 linux
在这里我将介绍两种编译方法,但是在我移植软件的过程中发现第一种方法是存在很大问题的,建议使用第二种方法。
方法一:
首先电脑得先安装arm-linux的交叉编译环境,这里就不介绍这个了,直接说重点。
1、在终端窗口输入sudo apt-get install cmake-qt-gui下载cmake图形界面
2、安装好后在终端窗口输入cmake-gui打开cmake的gui界面
在“where is the source code”中填入电脑中opencv源码的位置,“where to build the binaries”填入生成make编译文件的位置,然后点击configure按钮,选择最后一项
点击NEXT再跳出的界面中做如下设置
Operating System 选择目标系统arm-linux
Compilers中选择交叉编译器的gcc和g++
Target Root选择交叉编译器的路径
点击Finish按钮,开始生成配置文件,但是这个时候会报错
System is unknown to cmake, create:
Platform/arm-linux to use this system, please send your config file to [email protected] so it can be added to cmake
这个是因为Operating System填写的arm-linux不算Cmake能识别的目标系统,这里可以忽略这个错误。但是这个时候还有其他错误
CMake Error at cmake/FindCUDA.cmake:763 (if):
if given arguments:
"CUDA_VERSION" "VERSION_GREATER" "5.0" "AND" "CMAKE_CROSSCOMPILING" "AND" "MATCHES" "arm"
Unknown arguments specified
Call Stack (most recent call first):
cmake/OpenCVDetectCUDA.cmake:26 (find_package)
cmake/OpenCVFindLibsPerf.cmake:24 (include)
CMakeLists.txt:468 (include)
在终端窗口中进入 Wher to build the binarier 中设置的文件夹下执行make指令,make失败提示如下
../../lib/libopencv_core.so: undefined reference to `pthread_spin_init'
../../lib/libopencv_core.so: undefined reference to `pthread_spin_unlock'
../../lib/libopencv_core.so: undefined reference to `pthread_spin_lock'
../../lib/libopencv_core.so: undefined reference to `pthread_spin_destroy'
../../lib/libopencv_core.so: undefined reference to `pthread_once'
../../lib/libopencv_core.so: undefined reference to `clock_gettime'
../../lib/libopencv_core.so: undefined reference to `pthread_spin_trylock'
找不到pthread链接库,打开文件夹下的CmakeCache.txt进行修改
//Flags used by the linker.
CMAKE_EXE_LINKER_FLAGS:STRING=-lpthread -lrt
lrt这个不知道是什么,只是网上其他文章说要加上我就也加上了,然后再继续编译,编译完成后执行指令make install安装库文件和头文件到CMAKE_INSTALL_PREFIX指定的文件夹下。虽然网上有很多文章写的都是用这个方法,都是这个方法是有问题的,前面所提到的configure时提示的System is unknown to cmake,这个错误是直接被我忽略的,都是其实这个是很有问题的,因为CMake编译过程中我们没有告诉编译器我们要用的是是哪个系统,那有些功能它就不知道是选择编译和window兼容的代码,还是和linux兼容的代码,比如我在后面用这个编译好的opencv库写的程序放到210的板子上运行时,软件自带的函数cvCreatCamerCapture没办法识别板子上的usb摄像头,在谷歌查了很久才发现是编译的时候没有支持V4L2,后来发现是目标系统选择的问题,下面的另一种方法将解决这个问题。
方法二 :
前面再configure时提示的System is unknown to cmake是被我忽略不管的下面介绍下不忽略这个错误的编译过程。
出现这个错误的原因是Cmake不能识别arm-linux这种系统,所以我们把他改成Linux,注意第一个字母大写,不能写错linux,否则还会出现那个错误
另外需要注意的是include Mode要选择成Search only in Target Root这样在后面opencv编译时搜索头文件就只会在Target Root指定的文件夹下搜索,而不会到你电脑的usr/include/下搜索,如果这里还是先前的search in Target Root, then native system则会到/usr/include/下搜索头文件,就会出现一些问题,在我的电脑中出现了下面的问题
/usr/include/bits/mathinline.h:675:3: error: unknown register name 'st' in 'asm'
/usr/include/bits/mathinline.h:675:3: error: unknown register name 'st' in 'asm'
/usr/include/bits/mathinline.h:675:3: error: unknown register name 'st' in 'asm'
接着后面和前面一样所去掉CUDA第三方库,更改CMAKE_INSTALL_PREFIX,更改后记得再点击一次configure然后再点击Generate,进入文件夹修改CmakeCache.txt,make,这个时候又报错了:
undefined reference to `dlopen'
没有找到dl库,继续修改CmakeCache.txt
CMAKE_EXE_LINKER_FLAGS:STRING=-lpthread -lrt -ldl
编译好后make install,这个时候其实大家会发现这个方法编译出来的链接库比第一种方法编译出来的链接库要多一些,在目前的嵌入式开发阶段中使用这个链接库还没有发现什么。其实我才移植了一个软件而已,哈哈!