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