您的位置:首页 > 运维架构

交叉编译opencv2.31与移植至arm9

2013-05-01 12:56 387 查看
项目需求,交叉编译opencv2.3.1,并移植到mini2440中,现将本人的心得与过程中的错误分享如下,希望对大家有所帮助。注意:在opencv2.0以上的版本编译都要借助于cmake工具生成Makefile,2.0一下版本一般都是

使用./configure生成Makefile。

一、开发环境

上位机:Fedora9.0

交叉编译器:arm-linux-gcc4.4.3(友善之臂提供)

cmake-2.8.7-Linux-i386.sh

二、安装交叉编译工具链

本人安装目录为:/opt/toolchain/4.4.3

添加环境变量:在PATH环境变量中添加交叉编译工具链的bin路径:/opt/toolchain/4.4.3/bin (大家根据自己的安装路径而定)

三、安装cmake

在Linux下也有cmake的GUI版本,我使用的版本如上文提到的,大家可以在网上搜索下,有很多的下载链接。

安装步骤:在linux系统中修改cmake-2.8.7-Linux-i386.sh的执行权限

[root@localhost opt]# chmod +x cmake-2.8.7-Linux-i386.sh (修改为可执行权限)

执行cmake-2.8.7-Linux-i386.sh:

[root@localhost opt]# ./cmake-2.8.7-Linux-i386.sh

回车后在就会在当前目录下解压出cmake-2.8.7-Linux-i386文件夹,进入文件夹:

[root@localhost opt]# cd cmake-2.8.7-Linux-i386

可以发现目录下bin、include等目录,进入bin目录:

[root@localhost cmake-2.8.7-Linux-i386]# cd bin

可以发现bin目录下有cmake-gui、cmake、ccmake等可执行文件

在Linux图形界面下,执行cmake-gui文件:

[root@localhost bin]# ./cmake-gui

出现如下界面:



选择源代码目录:/opt/OpenCV-2.31

选择Build目录:/opt/opencv2.3.1_forArm,大家根据自己的喜好设置编译目录吧。

点击Configure,保持generator为Unix Makefiles,选择Specify options for cross-compiling,点击Next

Operating System填写arm-inux

C Compilers填写/opt/toolchain/4.4.3/bin/arm-linux-gcc

C++ Compilers填写/opt/toolchain/4.4.3/bin/bin/arm-linux-g++

程序库的Target Root填写/opt/toolchain/4.4.3/bin/,然后点击Finish,如下图:



上面标注的表示opencv将要安装的目录,默认为/usr/local,为了便于管理,大家可以安装在自己设定的目录下,可以修改,同时,网上资料说:另外,我没有安装tiff图像的支持,因此去掉WITH_TIFF(出自:http://blog.csdn.net/eagelangel/article/details/7232364)。但是我没有这么做。在此点击Configure,然后点击Gennerate就会生成Makefile。

进入/opt/opencv2.3.1_forArm目录,执行make命令,就会编译opencv,编译过程中遇到如下错误:

In file included from /opt/OpenCV-2.3.1/modules/flann/src/precomp.hpp:9,

from /opt/opencv2.3.1_forArm/modules/flann/opencv_flann_pch_dephelp.cxx:1:

/opt/OpenCV-2.3.1/modules/flann/include/opencv2/flann/dist.h: In function 'T cvflann::abs(T) [with T = long double]':

/opt/OpenCV-2.3.1/modules/flann/include/opencv2/flann/dist.h:63: error: 'fabsl' was not declared in this scope

make[2]: *** [modules/flann/CMakeFiles/opencv_flann_pch_dephelp.dir/opencv_flann_pch_dephelp.obj] Error 1

make[1]: *** [modules/flann/CMakeFiles/opencv_flann_pch_dephelp.dir/all] Error 2

make: *** [all] Error 2

解决方法:修改OpenCV-2.3.1/modules/flann/include/opencv2/flann/dist.h文件第63行的源码:将absl()修改为abs()

如果编译过程遇到如下错误:

Linking CXX executable ../../bin/opencv_test_calib3d

../../lib/libopencv_core.so: undefined reference to `pthread_key_create'

../../lib/libopencv_core.so: undefined reference to `pthread_getspecific'

../../lib/libopencv_ts.so: undefined reference to `pthread_key_delete'

../../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_setspecific'

collect2: ld returned 1 exit status

make[2]: *** [bin/opencv_test_calib3d] Error 1

make[1]: *** [modules/calib3d/CMakeFiles/opencv_test_calib3d.dir/all] Error 2

make: *** [all] Error 2

解决方案:修改/opt/opencv2.3.1目录下的CMakeCache.txt,CMAKE_EXE_LINKER_FLAGS原来为空,加上-lpthread -lrt,如下图:



注意:每次错误产生,经修改后,只要再次执行make命令就接着编译,编译成功后,执行make intall命令就会安装opencv。

由于本人的安装目录为:/opt/opencv2.3.1_arm,大家可以看到生成了bin、lib、include等目录,如下:



在lib目下可以发现很多动态库文件,如下:



至此,opencv交叉编译成功了。时间仓促,文中难免疏漏,欢迎大家指正,谢谢!!!email:forstudy@yahoo.cn

本人写此文参考了eagelangel的博文,在此表示感谢,博文出处:http://blog.csdn.net/eagelangel/article/details/7232364
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: