上一篇介绍了如何交叉编绎ffmpeg,本篇介绍如何配置和编绎OpenCv。
1、编绎环境
宿主机:ubuntu12.04 x64 3.5.0-44-generic交叉编绎器:arm-linux-gcc 4.6.2目标平台:FreeScale I.MAX6 4核1.2G
2、准备工作
bzip2-1.0.6.tar.gz
yasm-1.2.0.tar.gz
OpenCV-2.4.3.tar.bz2
3、开始编绎
将下载源码包放到/opt/EmbedSky/freescale/E9/document/OpenCv目录下,下面开始编绎过程
1、编译libz库
tar zxvf bzip2-1.0.6.tar.gz -C ./
cd bzip2-1.0.6/
修改Makefile如下内容:
# To assist in cross-compiling
CC=arm-linux-gcc
AR=arm-linux-ar
RANLIB=arm-linux-ranlib
LDFLAGS=
BIGFILES=-D_FILE_OFFSET_BITS=64
CFLAGS=-Wall -Winline -O2 -g $(BIGFILES)
#注意:64位下,上面一句-O2 需改为-O3 加上-fPIC
# Where you want it installed when you do 'make install'
PREFIX=/opt/EmbedSky/freescale/E9/document/OpenCv/__install
#屏蔽test部分
all: libbz2.a bzip2 bzip2recover test
#上面这一句去掉test
保存退出后编译安装:make && make install
2、yasm的交叉编译
tar zxvf yasm-1.2.0.tar.gz -C ./ cd yasm-1.2.0/ ./configure --host=arm-linux --prefix=/opt/EmbedSky/freescale/E9/document/OpenCv/__install --enable-shared --enable-static make make install
3、ffmpeg编绎请参考上一篇文章
4、opencv配置和编译
4.1 安装cmake-gui
sudo apt-get install cmake-gui
4.2 创建一个目录,用来保存cmake-gui配置完成后的源码
mkdir /opt/EmbedSky/freescale/E9/document/OpenCv/opencv-build
4.3 进入opencv源码目录,运行cmake-gui,打开配置界面如下:
4.4 选择opencv源码路径和新建的/opt/EmbedSky/freescale/E9/document/OpenCv/opencv-build目录。
点击“Configure”,进入配置界面:
4.5 选择“Specify options for cross-compiling”,点击“Next”:
选择交叉编绎器的相关路径
点击“Finish”完成配置。
4.7 配置编绎选项
去除"WITH_CUDA"和"WITH_TIFF",选项,勾选"WITH_V4L","BUILD_JPEG","BUILD_PNG","BUILD_ZLIB"选项。
选择bzip2库的路径,和opencv安装的路径:
![]()
此步骤可能会出现无法选择BZIP2_LIBRARIES路径的情况,解决方法:先取消掉“BUILD_ZLIB”选择,然后点击“Configure”,这样就会出现BZIP2_LIBRARIES,选择路径后再勾选上“BUILD_ZLIB”。
最关键的步骤:添加ffmpeg的支持(重要,容易出错):将ffmpeg的库和头文件全部放到交叉编译器的对应的目录中去(是复制,不是剪切),将ffmpeg生成后的lib/pkconfig目录中的*.PC文件复制到/usr/lib/pkconfig目录中。
将生成的库文件拷贝到/opt/EmbedSky/toolchains/gcc-4.6.2/tq-linaro-toolchain/arm-fsl-linux-gnueabi/multi-libs/lib目录
将生成的头文件拷贝到/opt/EmbedSky/toolchains/gcc-4.6.2/tq-linaro-toolchain/arm-fsl-linux-gnueabi/include目录
以上操作的目的是让cmake可以识别到我们编绎成功的库和头文件。
点击“Configure”,进行配置。此时可看到配置信息:
如上信息可看到ffmpeg库的相关信息,如果FFMPEG选项中为NO,或对应的库的版本与交叉编译后的ffmpeg库的版本不一样,则表示opencv没关联上ffmpeg,需重新检查一下ffmpeg的支持,重新点击“Configure”。
查看对V4L的支持(如果没支持,则不能打开USB摄像头),如下:
说明V4L已经支持上,若为下图所示:
![]()
则表示还没支持上V4L,拷贝android源码目录下的TQIMX6_android-4.2.2/bionic/libc/kernel/common/linux/videodev.h到交叉编绎器的
/opt/EmbedSky/toolchains/gcc-4.6.2/tq-linaro-toolchain/arm-fsl-linux-gnueabi/multi-libs/usr/include/linux/目录下。
再次执行Configure。
确定配置没问题,则可点击“Generate”,将编译规则导入/opt/EmbedSky/freescale/E9/document/OpenCv/opencv-build目录。
进入/opt/EmbedSky/freescale/E9/document/OpenCv/opencv-build目录,
make -j4make install
5、常见问题
常见错误(低版本的交叉编译器可能出现):
错误1:
../../lib/libopencv_highgui.so: undefined reference to `_TIFFmemcpy'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFmemset'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFwarningHandler'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFmemcmp'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFfree'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFmalloc'
../../lib/libopencv_highgui.so: undefined reference to `TIFFOpen'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFrealloc'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFerrorHandler'
collect2: ld returned 1 exit status
make[2]: *** [bin/opencv_perf_core] 错误 1
make[1]: *** [modules/core/CMakeFiles/opencv_perf_core.dir/all] 错误 2
make: *** [all] 错误 2
解决方法:修改CMakeCache.txt,WITH_TIFF:BOOL=ON,改成OFF,重新编译,错误消除。
遇到错误2:
Linking CXX executable ../../bin/opencv_createsamples
../../lib/libopencv_core.so: undefined reference to `clock_gettime'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFerrorHandler'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFrealloc'
../../lib/libopencv_core.so: undefined reference to `pthread_key_create
解决方法:
修改CMakeCache.txt,CMAKE_EXE_LINKER_FLAGS原来为空,加上-lpthread -lrt,重新编译,错误消除
以上2个错误可能会同时出现,改完再次执行make
//64位下用4.4.6交叉编译器如果出现类似错误:
../../3rdparty/lib/libzlib.a: could not read symbols: Bad value
collect2: ld returned 1 exit status
make[2]: *** [lib/libopencv_core.so] 错误 1
make[1]: *** [modules/core/CMakeFiles/opencv_core.dir/all] 错误 2
make: *** [all] 错误 2
解决方法:
进入opencv目录下的3rdparty的对应目录CMakeFiles/ *.dir下,打开flags.make,在C_FLAGS = 后添加-O3 -fPIC用来支持在64位机上编译
如../3rdparty/zlib/CMakeFiles/zlib.dir/flags.make
修改C_FLAGS = -W -Wall 为 C_FLAGS = -O3 -fPIC -W -Wall
和
修改CXX_FLAGS = -W -Wall 为 C_FLAGS = -O3 -fPIC -W -Wall
下一篇介绍如何使用OpenCv,控制USB摄像头进行预览,拍照和录像,敬请期待!