linux 交叉编译4.8,【参赛手记】Ubuntu Linux 下OpenCV 2.4.3以及Qt 4.8.3的交叉编译

主机平台(HOST):KUbuntu12.04(HP CQ45 308)

目标平台(TARGET):嵌入式Linux系统 3.x内核(Xilinx ZEDBoard)

由于OpenCV需要进行视频中的运动检测与分割,自然要用到相关函数打开AVI视频.如果只使用OpenCV进行交叉编译,那么默认情况下不支持AVI格式的打开与写入,这是因为少了很多解码库与编码库,如x264,ffmpeg等,因此首先要对这些库进行一次交叉编译后,再进行OpenCV库的交叉编译才能支持AVI格式的视频,这里首先给出OpenCV交叉编译时各个库的依赖关系:

OpenCV

|--------zlib

|--------jpeg

|--------libpng

|--------zlib

|--------tiff

|--------zlib

|--------ffmpeg

|--------x264

|--------xvidcore

其中各个源码包之间的依赖关系还是有一定的讲究的,否则很容易编译通不过,这里建议下载较新的稳定版进行交叉编译,下面列出本人已经成功编译通过的源码包版本:

ffmpeg-0.10.3

tiff-4.0.3

jpeg-8d

x264-snapshot-20120528-2245-stable

libpng-1.5.14

xvidcore-1.3.2

OpenCV-2.4.3

zlib-1.2.7

环境变量如下(最好在/etc/profile中添加):

export PATH=/opt/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin:$PATH#交叉编译工具链

export CROSS_COMPILE=arm-xilinx-linux-gnueabi-#编译Xilinx ZEDBoard linux内核时需要的一个环境变量

export ZYNQ_QT_BUILD=/zynq/qt/qt-everywhere-opensource-src-4.8.3

export ZYNQ_QT_INSTALL=/zynq/qt/qt-lib           #QT交叉编译库的安装路径

export ZYNQ_CV_INSTALL=/zynq/opencv/opencv-lib  #OpenCV交叉编译库的安装路径

————————————————————————————————————————————————

OpenCV-2.4.3

依赖库的配置以及注意事项如下:

zlib-1.2.7

export CC=arm-xilinx-linux-gnueabi-gcc

./configure --prefix=$ZYNQ_CV_INSTALL --shared

make

make install

注意:这里需要事先声明CC变量,zlib中没有配置--host之类的选项

jpeg-8d

./configure --prefix=$ZYNQ_CV_INSTALL --host=arm-xilinx-linux-gnueabi --enable-shared

make

make install

libpng 1.5.14

./configure --prefix=$ZYNQ_CV_INSTALL --host=arm-xilinx-linux-gnueabi --enable-arm-neon --enable-shared --with-pkgconfigdir=$ZYNQ_CV_INSTALL/lib/pkgconfig LDFLAGS=-L$ZYNQ_CV_INSTALL/lib CFLAGS=-I$ZYNQ_CV_INSTALL/include

make

make install

注意:libpng编译过程中可能会用到zlib之类的库,因此我们需要添加额外的LDFLAGS和CFLAGS变量,更多的信息可以通过./configure --help进行参考

x264-snapshot-20120528-2245-stable

./configure --host=arm-linux --cross-prefix=arm-xilinx-linux-gnueabi- --enable-shared --prefix=$ZYNQ_CV_INSTALL

make

make install

xvidcore-1.3.2

cd build/generic

./configure --prefix=$ZYNQ_CV_INSTALL --host=arm-xilinx-linux-gnueabi  --disable-assembly

make

make install

注意:xvidcore的编译中可能会调用arm指令集,但是在ZEDBoard上的ARM v7指令集的CortexA9核心只能支持Thumb/Thumb2,因此这里需要禁用汇编选项--disable-assembly

tiff-4.0.3

./configure --prefix=$ZYNQ_CV_INSTALL --host=arm-xilinx-linux-gnueabi --enable-shared LDFLAGS=-L$ZYNQ_CV_INSTALL/lib CFLAGS=-I$ZYNQ_CV_INSTALL/include

make

make install

注意:tiff编译过程中可能会用到zlib之类的库,因此我们需要添加额外的LDFLAGS和CFLAGS变量,更多的信息可以通过./configure --help进行参考

ffmpeg-0.10.3

./configure --prefix=$ZYNQ_CV_INSTALL --enable-shared --disable-static --enable-gpl --enable-cross-compile --arch=arm --disable-stripping --target-os=linux --enable-libx264 --enable-libxvid --cc=arm-xilinx-linux-gnueabi-gcc --enable-swscale --extra-cflags=-I$ZYNQ_CV_INSTALL/include --extra-ldflags=-L$ZYNQ_CV_INSTALL/lib --disable-asm

make

make install

注意:ffmpeg编译过程中可能会用到x264,xvid,zlib等之类的库,因此我们需要添加额外的LDFLAGS和CFLAGS变量,更多的信息可以通过./configure --help进行参考,另外这里的--disable-asm与xvidcore中的--disable-assembly的作用是一样的,否则也是不能编译通过的

OpenCV2.4.3交叉编译过程:

由于OpenCV从2.0以后的版本开始都是使用Cmake进行配置管理的,因此我们需要安装相关的工具(对于PC机上OpenCV的本地编译,可以参考官方网站上的),交叉编译的情况下我们需要安装cmake以及cmake-gui(包含在cmake-qt-gui中):

sudo apt-getinstall cmake cmake-qt-gui

首先解压OpenCV2.4.3:

tar xvfOpenCV-2.4.3.tar.bz2

然后进入源码目录再新建一个build文件夹并进入build文件夹目录:

cdOpenCV-2.4.3

mkdirbuild

cd build

在当前目录下新建toolchain.cmake文档,内容如下:

###########user defined#############

set( CMAKE_SYSTEM_NAME Linux )

set( CMAKE_SYSTEM_PROCESSOR arm )

set( CMAKE_C_COMPILER arm-xilinx-linux-gnueabi-gcc )

set( CMAKE_CXX_COMPILER arm-xilinx-linux-gnueabi-g++ )

###########user defined#############

set( CMAKE_FIND_ROOT_PATH "/zynq/opencv/opencv-lib" )

set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )

set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )

set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )

######################################

注意:最后的四行是用于交叉编译情况下依赖库查找路径以及查找模式的,它对于cmake能否找到依赖库来说非常重要

然后进行cmake的配置:

cmake-DCMAKE_TOOLCHAIN_FILE=toolchain.cmake../

注意:

1. cmake的配置过程会修改OpenCV源码中的内容,因此如果配置失败的话请从解压源码开始从头来过.

2. 配置过程开始之后会出现一堆的配置信息,如果出现问题请仔细参考配置信息.

3. 查找依赖库的过程中调用pkg-config工具进行查找,对应的cmake命令在OpenCV-2.4.3/cmake/OpenCVFindPkgConfig.cmake文件中,如果配置出现问题或者不能找到对应的库路径,可以在使用cmake重新配置之前在OpenCVFindPkgConfig.cmake找到#message(STATUS "  ${_varname} ... ${_pkgconfig_invoke_result}"),将#删除,在配置过程中会输出pkg-config的查找过程,这是一个很不错的查错方式

配置完成以后在当前目录下执行cmake-gui,设置好源码路径(OpenCV-2.4.3)与编译路径(OpenCV-2.4.3/build),将不要的东西全部勾掉,最后点击config之后出现如下配置信息:

General configuration for OpenCV 2.4.3 =====================================

Version control:               exported

Platform:

Host:                        Linux 3.2.0-37-generic-pae i686

Target:                      Linux arm

CMake:                       2.8.7

CMake generator:             Unix Makefiles

CMake build tool:            /usr/bin/make

Configuration:               Release

C/C++:

Built as dynamic libs?:      YES

C++ Compiler:                /opt/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/arm-xilinx-linux-gnueabi-g++  (ver 4.6.1)

C++ flags (Release):         -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -O3 -DNDEBUG  -DNDEBUG

C++ flags (Debug):           -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -g  -O0 -DDEBUG -D_DEBUG -ggdb3

C Compiler:                  /opt/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/arm-xilinx-linux-gnueabi-gcc

C flags (Release):           -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -O3 -DNDEBUG  -DNDEBUG

C flags (Debug):             -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -g  -O0 -DDEBUG -D_DEBUG -ggdb3

Linker flags (Release):

Linker flags (Debug):

Precompiled headers:         YES

OpenCV modules:

To be built:                 core imgproc flann highgui features2d calib3d ml video objdetect contrib nonfree photo legacy gpu stitching ts videostab

Disabled:                    python world

Disabled by dependency:      -

Unavailable:                 androidcamera java ocl

GUI:

QT 4.x:                      NO

GTK+ 2.x:                    NO

GThread :                    NO

GtkGlExt:                    NO

OpenGL support:              NO

Media I/O:

ZLib:                        zlib (ver 1.2.7)

JPEG:                        libjpeg (ver 62)

PNG:                         build (ver 1.5.12)

TIFF:                        build (ver 42 - 4.0.2)

JPEG 2000:                   build (ver 1.900.1)

OpenEXR:                     build (ver 1.7.1)

Video I/O:

DC1394 1.x:                  NO

DC1394 2.x:                  NO

FFMPEG:                      YES

codec:                     YES (ver 53.61.100)

format:                    YES (ver 53.32.100)

util:                      YES (ver 51.35.100)

swscale:                   YES (ver 2.1.100)

gentoo-style:              YES

GStreamer:                   NO

OpenNI:                      NO

OpenNI PrimeSensor Modules:  NO

PvAPI:                       NO

GigEVisionSDK:               NO

UniCap:                      NO

UniCap ucil:                 NO

V4L/V4L2:                    NO/YES

XIMEA:                       NO

Xine:                        NO

Other third-party libraries:

Use TBB:                     NO

Use Cuda:                    NO

Use OpenCL:                  NO

Use Eigen:                   NO

Python:

Interpreter:                 /usr/bin/python (ver 2.7.3)

Tests and samples:

Tests:                       NO

Performance tests:           NO

Examples:                    NO

Install path:                  /zynq/opencv/OpenCV-2.4.3-cross/OpenCV-2.4.3/build/install

cvconfig.h is in:              /zynq/opencv/OpenCV-2.4.3-cross/OpenCV-2.4.3/build

-----------------------------------------------------------------

Configuring done

最后点击generate,生成makefile,之后就是我们熟悉的:

make

make install

PS:不要忘了在cmake-gui中配置安装路径,对应的环境变量是CMAKE_INSTALL_PREFIX

到此OpenCV-2.4.3的编译与安装就已经完成了。

————————————————————————————————————————————————————————

Qt 4.8.3

Qt的交叉编译主要参考懒兔子大神的,不过在编译过程中遇到了一些问题,我将这些问题总结了出来:

编译使用的4.8.3版本可以在QT官网上下载:

首先我们将qt-everywhere-opensource-src-4.8.3.tar.gz解压到ZYNQ_QT_BUILD(见本文开头的环境变量)指向的目录中,把qt_build_src.tar里的qmake.conf配置文件复制到qt-everywhere-opensource-src-4.8.3/mkspecs/qws/linux-arm-gnueabi-g++目录下,这个文件用来告知QMake应该用哪个编译器来编译QT工程。然后对QT进行配置:

./configure

-embedded arm \

-xplatform qws/linux-arm-gnueabi-g++ \

-little-endian \

-opensource \

-host-little-endian \

-confirm-license \

-nomake demos \

-nomake examples \

-prefix $ZYNQ_QT_INSTALL

虽然QT Lib是在本地进行交叉编译的,这些配置选项则根据目标平台而定,其中-embedded arm一项表示目标设备为ARM核心设备,-prefix $ZYNQ_QT_INSTALL则将QT Lib安装到指定的目录里。

注意:这里由于qmake.conf是4.7版本中的文件,因此与4.8版本的不匹配,在configure过程中会出问题,根据终端中出现的提示,我们需要将开头的四行换成下面的内容:

include(../../common/gcc-base-unix.conf)

include(../../common/g++-unix.conf)

include(../../common/linux.conf)

include(../../common/qws.conf)

配置过程可能需要个几分钟,配置完成之后就可以进行我们熟悉的

make

make install

到此Qt4.8.3的交叉编译就完成了。对于在zedboard上运行qt,懒兔子大神的博客已经讲的很清楚了,有兴趣可以参考他的博客。而opencv在ZEDBoard上的运行稍后总结,敬请期待

你可能感兴趣的:(linux,交叉编译4.8)