移植QT和opencv到ARM

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那麼客戶端程序就會自動連接到服務器程序中









發佈了28 篇原創文章 · 獲贊 12 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章