移植QT和opencv到ARM

来源:互联网 发布:德高防水涂料js 报价 编辑:程序博客网 时间:2024/04/30 06:54

linux环境:Ubuntu 12.04

QT版本:4.7

opencv版本:2.4.3

ARM:友善板6410

一 安装交叉编译器

从光盘上拷贝mini6410上的交叉编译器到 /opt 下,目前最新的mini6410交叉编译器是arm-linux-gcc-v6-vfp-20101103.tgz, 如果你的mini6410A光盘中的版本比较旧,建议先从友善之臂官方网站http://www.arm9.net下载最新的mini6410光盘。

在光盘上找到交叉编译后,将其拷到到 /opt下,然后输入以下命令进行解压: 

# cd /

# tar xvzf /opt/arm-linux-gcc-v6-vfp-20101103.tgz

交叉编译器会解压到 /opt/FriendlyARM/toolschain/4.5.1/目录下,现在将编译器路径添加到PATH 环境变量中:#export /opt/FriendlyARM/toolschain/4.5.1/bin/:$PATH

(注:可以在/etc/profile 里加上export PATH=“/opt/FriendlyARM/toolschain/4.5.1/bin/:$PATH”或者可以在自己用户目录或ROOT目录里的 .bashrc文件里加上PATH环境变量,加完环境变量之后要source /etc/profile 使之生效)

执行以下命令能成功显示编译器版本信息表明编译器已安装成功。

 # arm-linux-gcc -v 

二 移植QT4.7

1 获得 Qt4.7 的源代码

在mini6410光盘A的以下路径“开发文档和教程\01 Qt4和Qtopia编程开发指南\源代码\第三章\3-3”可以拿到Qt4.7.0源代码的原始包qt-everywhere-opensource-src-4.7.0.tar.gz,将其拷贝到 /opt 下,然后在linux终端上输入如下命令(不用键入#),在/opt/mini6410下解压Qt4.7.0的源码包: 

# cd /opt/mini6410

# tar xvzf/opt/qt-everywhere-opensource-src-4.7.0.tar.gz

2 交叉编译Qt4.7

执行以下命令执行Qt4.7.0编译前的配置:

# cd /opt/mini6410/qt-everywhere-opensource-src-4.7.0

# echo yes | ./configure -prefix/opt/Qt4.7 -opensource -embedded arm -xplatform qws/linux-arm-g++ -no-webkit-qt-libtiff -qt-libmng -qt-mouse-tslib -qt-mouse-pc -no-mouse-linuxtp -no-neon

注:在Kubuntu中配置时会遇到问题 :上面的配置去掉 –qt-mouse-tslib 加上-little-endian-

上面的主要参数含义说明如下:

-embedded arm: 表示将编译针对arm平台的embedded版本;

-xplatform qws/linux-arm-g++: 表示使用arm-linux交叉编译器进行编译;

-qt-mouse-tslib: 表示将使用tslib来驱动触摸屏;

-prefix /opt/Qt4.7: 表示Qt4.7最终的安装路径是 /opt/Qt4.7 ,注意,部置到mini6410开发板时,也需要把Qt4.7放在这个路径上;

执行以下命令进行编译并安装Qt4.7: # make && make install

上面命令中出现的&&符号表示只有左边的make 命令执行成功时(返回0),才会执行右边的make install命令。

编译完成后,Qt4.7被安装在/opt/Qt4.7 目录下。

(注:后来换了Ubuntu,没有遇到上述问题)

3 在mini6410上部置Qt4.7

在PC上执行如下命令将Qt4.7打包:

 # cd /opt

# tar cvzf qt4.7.tgz Qt4.7

打包完成后,将qt4.7.tgz拷贝到SD卡, 然后将SD卡插入mini6410开发板,执行以下命令将qt4.7.tgz解压到开发板上的/opt目录下:

@# rm/usr/local/Trolltech/QtEmbedded-4.7.0-arm/-rf

@# cd /opt

@# tar xvzf /sdcard/qt4.7.tgz

(注:在上述命令中,为了保证有足够的空间存放我们自已编译的Qt4.7, 我们先将友善之臂提供的Qt4.7删除掉)

注意,一定要保持Qt4.7的目录为/opt/Qt4.7, 因为我们在配置Qt4.7时,指定了-prefix参数为/opt/Qt4.7。

至此,Qt4.7在mini6410上部署完成了,接下来我们将运行一个示例程序来测试Qt4.7是否能正常工作。

4 在mini6410上运行Qt4.7的示例程序

在运行任何Qt4.7程序之前,需要先退出Qtopia2.2.0或者Qt-Extended4.4.3 等一切Qt程序,退出Qtopia2.2.0的方法是:在Qtopia2.2.0中点“设置”中的“关机”可出现如下界面,点“Terminate Server”即可关闭Qtopia-2.2.0系统。

也可以使用其他的方法,比如在启动脚本/etc/init.d/rcS中注释掉qtopia启动项,再重新系统系统;或者使用killall命令杀死相关的进程(比较多);甚至是直接删除/opt目录中的所有内容重启。

如何运行Qt4.7的示例程序呢?

在我们部署到 mini6410开发板上的Qt4.7的/opt/Qt4.7/examples/目录就带有不少的示例程序,并且已经编译好生成有可执行文件,我们试着直接运行一个程序试试:

@# /opt/Qt4.7/demos/embedded/fluidlauncher/fluidlauncher

程序没法运行,提示有错误,原因是Qt4.7的环境没有设置好,为了更方便地运行Qt4程序,我们先编写一个脚本setqt4env,这个脚本用于设置Qt4.7所需要的环境变量。

输入以下命令创建并编写脚本 /bin/setqt4env :

@# vi/bin/setqt4env

在vi编辑器中输入如下内容:

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

#!/bin/sh

if [ -e/etc/friendlyarm-ts-input.conf ] ; then

./etc/friendlyarm-ts-input.conf

fi

true${TSLIB_TSDEVICE:=/dev/touchscreen}

TSLIB_CONFFILE=/etc/ts.conf

exportTSLIB_TSDEVICE

exportTSLIB_CONFFILE

exportTSLIB_PLUGINDIR=/usr/lib/ts

exportTSLIB_CALIBFILE=/etc/pointercal

export QWS_DISPLAY=:1

exportLD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

exportPATH=/bin:/sbin:/usr/bin/:/usr/sbin:/usr/local/bin

if [ -c/dev/touchscreen ]; then

exportQWS_MOUSE_PROTO="Tslib MouseMan:/dev/input/mice"

if [ ! -s/etc/pointercal ] ; then

rm /etc/pointercal

/usr/bin/ts_calibrate

fi

else

exportQWS_MOUSE_PROTO="MouseMan:/dev/input/mice"

fi

export QWS_KEYBOARD=TTY:/dev/tty1

export HOME=/root

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

将脚本设置可执行权限:

 @#chmod +x /bin/setqt4env

现在再试一下运行示例程序:

@# . setqt4env

@# cd/opt/Qt4.7/demos/embedded/fluidlauncher/

@# ./fluidlauncher -qws

上面的命令中,先调用setqt4env设置一下环境变量,再调用示例程序,注意,setqt4env命令前面的“.”与setqt4env之间要有一个空格隔开,表示脚本中导出的环境变量将应用到当前shell会话中。

三 在linux下安装opencv

Installation in Linux

Required Packages

·     GCC 4.4.x or later. This can be installed with:

sudo apt-get install build-essential

·     CMake 2.6 or higher;

·     Git;

·     GTK+2.x or higher, including headers (libgtk2.0-dev);

·     pkg-config;

·     Python 2.6 or later and Numpy 1.5 or later with developer packages(python-dev, python-numpy);

·     ffmpeg or libav development packages: libavcodec-dev, libavformat-dev, libswscale-dev;

·     [optional] libdc1394 2.x;(libdc1394-22-dev)

·     [optional] libjpeg-dev,libpng-dev, libtiff-dev, libjasper-dev.

All thelibraries above can be installed via Terminal or by using Synaptic Manager.

Getting OpenCV Source Code

获取opencv源码,在/home/mxq下解压,会生成opencv文件夹

Building OpenCV from Source Using CMake, Using the Command Line

1. Create a temporary directory,which we denote as <cmake_binary_dir>, where you want to put thegenerated Makefiles, project files as well the object files and outputbinaries.

2. Enter the<cmake_binary_dir> and type

cmake [<some optional parameters>] <path tothe OpenCV source directory>

For example

cd /home/mxq/opencv

mkdir release

cd release

cmake -DCMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..

Enterthe created temporary directory (<cmake_binary_dir>) and proceed with:

make

sudo make install

使用sudo ldconfig 刷新库路径,库的路径会放在ld.so.cache里,启动时会读这个文件找库的路径

四 移植opencv

1   编译环境及库文件

Linux环境:Ubuntu

ARM:友善板6410

需要的库文件:

libjpeg 

libpng 

yasm 

libx264 

libxvid 

ffmpeg 

cmake-gui

2 opencv-2.4.3的移植过程

首先把需要的库的源码都拷到/home/mxq/opencv下,然后解压,在各自的文件夹下编译)
1)、libz的交叉编译:

# ./configure --prefix=/home/mxq/compiled-lib-include

 –shared --host=arm-linux

(注:用--host=arm-linux可以修改Makefile 添加arm-linux,可以把一些需要交叉编译的选项前加上arm-linux,如arm-linux-g++)

修改makefile

CC=arm-linux-gcc

AR=arm-linux-ar

ARFLAGS=rc

RANLIB=arm-linux-ranlib

CDSHARED=arm-linux-gcc –shared-wl,-soname,libz.so.1,--version-script,zl lib.map
#make
#make install

2)、libjpeg的交叉编译:

#./configure --host=arm-linux --prefix=/home/mxq/compiled-lib-include

 --enable-shared --enable-static
#make install
3)、libpng的交叉编译
#./configure --host=arm-linux --prefix=/home/mxq/compiled-lib-include

 --enable-shared --enable-static
#make
#make install
4)、yasm的交叉编译:

#./configure --host=arm-linux --prefix=/home/mxq/compiled-lib-include

 --enable-shared --enable-static
#make
#make install
5)、libx264的交叉编译:
# /configure --enable-shared --host=arm-linux --disable-asm –prefix=/home/mxq/compiled-lib-include

 --cross-profix=arm-linux-
#make
#make install

(x264中用--cross-profix=arm-linux-  修改  添加arm-linux-,可以把一些需要交叉编译的选项前加上arm-linux,如arm-linux-g++)

6)、libxvid的交叉编译:
#cd build/generic
#./configure --prefix=/home/mxq/compiled-lib-include --host=arm-linux --disable-assembly
#make
#make install
7)、ffmpeg的交叉编译:
#./configure --prefix=/home/mxq/compiled-lib-include --enable-shared--disable-static --enable-gpl --enable-cross-compile --arch=arm--disable-stripping --target-os=linux --enable-libx264 --enable-libxvid--cc=arm-linux-gcc --enable-swscale
#make
#make install

8).cmake-gui安装

apt-get install cmake-gui

9)、opencv的交叉编译:
用到的主要目录说明:
交叉编译工具链所在目录 /opt/FriendlyARM/toolschain/4.5.1/

安装opencv的目录 /usr/local/ (默认) 我改为/home/mxq/compiled-lib-include

opencv源码所在录 /home/mxq/opencv/opencv-2.4.3/

编译好的opencv库所在目录/home/mxq/opencv/opencv-2.4.3/build

#mkdir build
#cd build
#cmake-gui


选择源代码目录/home/mxq/opencv/opencv-2.4.3/

选择Build目录:/home/mxq/opencv/opencv-2.4.3/build
点击Configure,保持generator为Unix Makefiles,选择Specify options forcross-compiling,点击Next,
Operating System填写arm-linux
C Compilers填写opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-gcc
C++ Compilers填写opt/FriendlyARM/toolschain/4.5.1//bin/arm-linux-g++
程序库的Target Root填写opt/FriendlyARM/toolschain/4.5.1/

然后点击Finish。
默认安装目录为/usr/local(我改为/home/mxq/compiled-lib-include

),点击Generate生成Makefile。

#make
-----------------------------------------------------------------
错误一:
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,重新编译,错误消除


错误二:
Linking CXX executable ../../bin/opencv_createsamples
../../lib/libopencv_highgui.so: undefined reference to `_TIFFerrorHandler'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFrealloc'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFmalloc'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFmemcpy'
../../lib/libopencv_highgui.so: undefined reference to `TIFFOpen'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFfree'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFwarningHandler'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFmemcmp'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFmemset'
    解决方法:修改CMakeCache.txt,WITH_TIFF:BOOL=ON,改成OFF,重新编译,错误消除。
------------------------------------------------------------------

未出现以上错误
#make install

至此opencv移植需要的库已经交叉编译完成,在开发板上运行程序时需要把这些库以及交叉编译QT的库都拷到开发板中,可以拷到/usr/local/lib下

五 在开发板上运行qt+opencv程序

在开发板中运行qt+opencv程序,需要用交叉编译好的QT去编译程序,编译时需要链接交叉编译好的opencv库。

在linux下安装qt,使用apt-get install qtcreator (重装系统后需要更新软件包才能下载,用sudo apt-get update)

QT装完后使用的是PC 系统的QT版本编译,我们交叉编译时要把QT 构建设置的QT版本改为我们交叉编译的QT版本,这里使用QT4.7,工具链改为/opt/FriendlyARM/toolschain/4.5.1/lib/arm-linux-gcc

编译时会遇到问题如:/opt/FriendlyARM/toolschain/4.5.1/lib/gcc/arm-none-linux-gnueabi/4.5.1/../../../../arm-none-linux-gnueabi/bin/ld:warning:../../lib/libopencv_core.so, needed by /home/mxq/compiled-lib-include/lib/libopencv_highgui.so,not found (try using -rpath or -rpath-link)

这个可能是这个交叉编译器的问题,把opencv编译好的库复制到/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabilib下

 cp –Prf /home/mxq/compiled-lib-include/libopencv_*/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabilib

这样编译就不会有警告了

最后再把编译好的可执行文件,编译好的Opencv库文件,编译好的qt库复制到开发板中,然后运行程序

(运行程序时会遇到问题,会出现../../lib/libav***** not found;

这个问题没有本质上解决,可能与编译器有关,在这里我们在/usr/local/lib下建立两个目录,如/usr/local/lib/test/test/,然后把库文件放在usr/local/lib下,可执行文件放在/usr/local/lib/test/test/下,这样可执行文件就满足../../lib这个条件,执行时在当前文件目录下../../就可以找到lib里的库文件。

编译opencv程序时要在OpenCV_Example.pro里把头文件以及库文件的路径加上

在开发板上运行QT或opencv程序时 在后面加上 -qws 如 ./OpencvExample -qws  

在嵌入式QT版中,程序需要服务器或自己作为服务器。使用-qws选项 表示程序自己当作服务器来运行,只要不使用-qws那么客户端程序就会自动连接到服务器程序中









0 0