移植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那么客户端程序就会自动连接到服务器程序中
- 移植QT和opencv到ARM
- OpenCV移植到ARM
- QT移植到ARM
- qt移植到arm
- Linux下移植OpenCV + Qt 到ARM(Tiny6410)总结
- Linux下移植OpenCV + Qt 到ARM(Tiny6410)总结
- Linux下移植OpenCV + Qt 到ARM(Tiny6410)总结 转
- Linux下移植OpenCV + Qt 到ARM(Tiny6410)总结
- Linux下移植OpenCV + Qt 到ARM(Tiny6410)总结
- Linux下移植OpenCV + Qt 到ARM(Tiny6410)总结 转
- Linux下移植OpenCV + Qt 到ARM(Tiny6410)总结
- Linux下移植OpenCV + Qt 到ARM(Tiny6410)总结
- Linux下移植OpenCV + Qt 到ARM(Tiny6410)总结 转
- Linux下移植OpenCV + Qt 到ARM(Tiny6410)总结
- Linux下移植OpenCV + Qt 到ARM(Tiny6410)总结
- OpenCV移植到ARM全过程
- OpenCV移植到ARM 全过程
- 移植OpenCV到ARM平台
- 《编辑之友》双核
- 数字图像处理中的邻域
- linux 安装XBMC打造自己的家庭影院
- 枚举的一些常用操作
- 最短路
- 移植QT和opencv到ARM
- 动态treeTable jquery插件使用
- 如何设置AnyChat的P2P连接策略
- 值类型和引用类型,栈和堆的含义
- JAVA学习笔记(5)_____String对象比较的一些个人见解
- 利用请求头判断是手机端还是PC端
- 线性回归
- C#基础--运算符及条件控制语句
- ZOJ - 1586 QS Network (最小生成树 Kruskal)