环境:
Ubuntu12.04
mini6410开发板
OpenCV-2.0.0
arm-linux-g++ 4.3.2 / arm-linux-gcc 4.3.2
CMake-gui 2.8.0
OpenCV2.0.0交叉编译过程:
1、在usr/local新建文件夹
# mkdir opencv
把下载的OpenCV-2.0.0.tar.bz2解压到 usr/local/opencv 目录下
2、然后在usr/local/opencv 新建一个 opencv-arm 文件夹,作为CMake编译arm版本的工作目录
# mkdir opencv-arm
如下图所示:
3、在终端里调出CMake gui界面:
# cmake-gui
按照下图方式选择源码目录和build目录
然后点击Configure按钮,保持generator为Unix Makefiles,选择Specify options for cross-compiling,点击Next
按照如下方式配置:
注:/usr/local/arm/4.3.2 为交叉编译工具 arm-linux-g++/gcc 的所在包含文件夹(在bin文件夹里面)
然后点击 “Finish” 按钮;
修改默认配置,默认安装目录为/usr/local,但我想对它统一归类,所以我在/usr/local/arm/4.3.2/lib目录下新建了一个opencv文件夹,在Cmake-gui里修改CMAKE_INSTALL_PREFIX变量改为/usr/local/arm/4.3.2/lib/opencv/
(另外,如果没有安装tiff图像的支持,请去掉WITH_TIFF)
然后点击Generate按钮生成Makefile;
4、在终端界面中,进入目录/usr/local/opencv/opencv-arm,运行make编译opencv
编译时发现如下错误:
Linking CXX executable ../../bin/opencv_createsamples
../../lib/libcxcore.so: undefined reference to `clock_gettime'
../../lib/libcxcore.so: undefined reference to `pthread_key_create'
../../lib/libcxcore.so: undefined reference to `pthread_getspecific'
../../lib/libcxcore.so: undefined reference to `pthread_setspecific'
原因是cmake不认识我定义的arm-linux系统标记,没有加上库pthread和rt的链接选项
此时需要修改CMakeCache.txt,CMAKE_EXE_LINKER_FLAGS原来为空,加上-lpthread -lrt,如下图:重新make编译,错误消除,编译成功之后的界面如下:
5、然后运行make install,将opencv生成的库和头文件安装到目录/usr/local/arm/4.3.2/lib/opencv/,结果如下:
6、把这5个 .so 库文件拷贝到ARM板系统中的 /lib 目录下面
7、写个简单的测试程序,打开摄像头并创建一个窗口显示
8、编译链接测试程序
arm-linux-g++ -I /usr/local/arm/lib/opencv/include/opencv -L/ usr/local/arm/lib/opencv/lib -lcv -lcxcore -lhighgui -lpthread -lrt -o test test.cpp
9、复制程序到嵌入式系统中运行
首先复制主机/usr/local/arm/lib/opencv/lib/下面的几个.so文件到嵌入式Linux系统的/lib/目录下,再复制我们编译的test到嵌入式系统/opt/myworks/目录下(并确保文件test属性为可执行),如果test可正常运行没有报告缺少库文件,说明我们编译的arm-linux版OpenCV库已经可以正常使用。