這篇博客算是接着Linux 下編譯、安裝、配置 QT這篇的,搞完PC平台的就來弄一下嵌入式平台的,Linux的東西搞起來麻煩的地方就在於太雜、太散,像QT,各版本之間都有很多差異,因此在網絡上查找資料不能光看某一個,必須很多資料綜合來判斷、取舍。
好了,下面進入正題,本篇主要記錄QT的交叉編譯過程,這過程中很多東西我都試着去理解,去找出為什么這樣做,然而畢竟時間有限,很多地方還不太清楚,只能先做了再說,后續的地方回頭慢慢理解。
軟件平台
Linux:Ubuntu 12.04 X86
QT:4.8.4
交叉編譯工具鏈:gcc version 4.3.2 (Sourcery G++ Lite 2008q3-72)
tslib編譯與安裝
tslib是電阻式觸摸屏用於校准的一個軟件庫,是一個開源的程序,能夠為觸摸屏驅動獲得的采樣提供諸如濾波、去抖、校准等功能,通常作為觸摸屏驅動的適配層,為上層的應用提供了一個統一的接口。因此這里先編譯安裝tslib,這樣在后面編譯Qt的時候才能打包編譯進去。
首先現在源文件http://download.csdn.net/source/3177449
編譯安裝過程很簡單
首先需要檢查一下軟件是否安裝
sudo apt-get install automake sudo apt-get install autogen sudo apt-get install autoconf
確定以上工具都已經安裝后,解壓安裝即可。
# tar -zxvf tslib-1.4.tar.gz # cd tslib # ./autogen.sh #./configure --host=arm-linux ac_cv_func_malloc_0_nonnull=yes --cache-file=arm-linux.cache -prefix=/usr/local/tslib
# make # make install
-prefix=/usr/local/tslib是指定安裝路徑,其實包括下文的安裝配置,路徑都可以不指定,默認就是安裝到/usr/local/目錄下
tslib的開發板移植與測試
將交叉編譯的tslib安裝到開發板上其實就是拷貝相關的文件並添加系統環境變量而已,所以相對操作較為簡單,主要的就是需要找對目錄就行。
按照上面的操作方法,交叉編譯安裝后的文件在/usr/local/tslib目錄下,因此需要拷貝的文件如下:
- /usr/local/tslib/lib文件下除去pkgconfig目錄外其他所有文件拷貝到開發板/lib目錄下
- /usr/local/tslib/etc下的ts.conf拷貝到開發板的/etc下,在復制對應目錄之前修改文件如下,也可以復制完成后修改。
下面是ts.conf文件的第一行與第二行
去掉# module_raw input前面的注釋,一定要注意中間的空格也去掉,module頂格。# Uncomment if you wish to use the linux input layer event interface # module_raw input
最后添加環境變量,通過超級終端在開發板系統中添加環境變量,可以在開發板文件系統的/etc/profile文件里添加,也可以直接添加。
export TSLIB_TSDEVICE=/dev/input/touchscreen0 export TSLIB_CONFFILE=/etc/ts.conf export TSLIB_PLUGINDIR=/lib/ts export TSLIB_CALIBFILE=/etc/pointercal export TSLIB_CONSOLEDEVICE=none export TSLIB_FBDEVICE=/dev/fb0
說明:
TSLIB_TSDEVICE //觸摸屏設備文件名。
TSLIB_CALIBFILE //校准的數據文件,由ts_calibrate校准程序生成。
SLIB_CONFFILE //配置文件名。
TSLIB_PLUGINDIR //插件目錄
TSLIB_CONSOLEDEVICE //控制台設備文件名
TSLIB_FBDEVICE //設備名以上環境變量在實際開發中的實際配置可以根據實際情況決定。而這些指定的設備節點一定要和你的開發板上的/dev目錄下的設備節點相對應。
最后運行測驗程序
ts_calibrate 進行校驗
ts_test 進行測試
測試結果如下圖所示:
說明:這個開發板的官方給的交叉編譯工具鏈是arm-2007q3,而我這里用的是OK6410開發板提供的工具鏈,這里使用暫時沒發現啥問題,不排除其他程序開發中可能存在啥問題。
emouse原創文章轉載請注明http://emouse.cnblogs.com/
QT 的交叉編譯與安裝
和PC平台下的編譯類似,通過運行./configure進行配置生成makefile文件,然后編譯安裝,只是因為是針對嵌入式平台需要進行一些針對性配置,這里生成一個自動配置文件,可以通過修改文件來方便的更改配置。
# cd qt-everywhere-opensource-src-4.8.4 #sudo gedit autoconfig.sh
加入以下內容保存.
#!/bin/sh
./configure \ -opensource \ -confirm-license \ -release -shared \ -embedded arm \ -xplatform qws/linux-arm-g++ \ -depths 16,18,24 \ -fast \ -optimized-qmake \ -pch \ -qt-sql-sqlite \ -qt-libjpeg \ -qt-zlib \ -qt-libpng \ -qt-freetype \ -little-endian -host-little-endian \ -no-qt3support \ -no-libtiff -no-libmng \ -no-opengl \ -no-mmx -no-sse -no-sse2 \ -no-3dnow \ -no-openssl \ -no-webkit \ -no-qvfb \ -no-phonon \ -no-nis \ -no-opengl \ -no-cups \ -no-glib \ -no-xcursor -no-xfixes -no-xrandr -no-xrender \ -no-separate-debug-info \ -nomake examples -nomake tools -nomake docs \ -qt-mouse-tslib \ -I/usr/local/tslib/include \ -L/usr/local/tslib/lib exit
文件中的內容就是需要配置的內容,同樣如果需要指定安裝路徑可以在開始加入-prefix=/usr/local/(自己的路徑)
上面的主要參數含義說明如下:
-embedded arm: 表示將編譯針對 arm 平台的 embedded 版本;
-xplatform qws/linux-arm-g++: 表示使用 arm-linux 交叉編譯器進行編譯;
-qt-mouse-tslib: 表示將使用 tslib 來驅動觸摸屏;
其他還有很多參數我也不太了解,后面使用的過程中再慢慢體會.
運行./autoconfig.sh 生成makefile文件,生成成功最后會輸出如下信息
Qt is now configured for building. Just run 'make'. Once everything is built, you must run 'make install'. Qt will be installed into /usr/local/Trolltech/QtEmbedded-4.8.4-arm To reconfigure, run 'make confclean' and 'configure'.
如果編譯出現缺少鏈接信息錯誤:
warning: libts-0.0.so.0, needed by , not found (try using -rpath or -rpath-link)
undefined reference to `ts_read_raw'
undefined reference to `ts_open'
undefined reference to `ts_fd'
undefined reference to `ts_config'
undefined reference to `ts_close'
undefined reference to `ts_read'
collect2: ld returned 1 exit status
解決方法如下:
修改qt-everywhere-opensource-src-4.8.4/mkspecs/qws/linux-arm-g++/qmake.conf 文件(添加lts參數):
QMAKE_CC = arm-linux-gcc -lts
QMAKE_CXX = arm-linux-g++ -lts
QMAKE_LINK = arm-linux-g++ -lts
QMAKE_LINK_SHLIB = arm-linux-g++ -lts
修改完成后保存退出,繼續編譯。
這段信息指明了安裝方式和默認路徑,所以可以看出不指定路徑情況下的默認安裝路徑,因此這個路徑沒必要手工指定,雖然查出來的資料都指定的。
接下來執行make 進行編譯,時間同樣需要很長的時間,視個人電腦配置而定,時間大概在半個小時左右吧。
最后make install安裝,安裝完成后可以在安裝目錄/usr/local/Trolltech/QtEmbedded-4.8.4-arm 下查看對應文件。
開發板配置
在開發板上的使用其實很簡單,只需要拷貝相應的庫文件並設置環境變量即可,拷貝的方法按照個人喜好,我是掛載nfs來實現拷貝。
root@emouse:/armnfs# cp -R /usr/local/Trolltech/QtEmbedded-4.8.4-arm/lib /armnfs/qt
設置環境變量:
export QTDIR=/opt/qt484 export LD_LIBRARY_PATH=$QTDIRlib:$LD_LIBRARY_PATH export PATH=$QTDIR/bin:$PATH export QWS_MOUSE_PROTO=tslib:/dev/input/touchscreen0 export QWS_DISPLAY="LinuxFb:mmWidth100:mmHeight130:0" export QT_QWS_FONTDIR=/opt/qt484/lib/fonts
在飛凌的OK6410板子中,是在/bin目錄下放一個腳本文件,在腳本文件中設置變量來實現運行,這樣可以為不同的程序進行單獨的配置,也可以設置開機運行等,用起來比較方便,下面是我的腳本文件,腳本中完成對所有環節變量的配置,當然這里是基於之前的改的,所以有些是多余的。最后運行的程序就是我放在opt目錄下的QC程序。關於在開發板上的Qt程序中顯示中文字體等設置可以參見 Qt 中顯示中文 這篇博客。
#!/bin/sh base1=qpe pid=`/bin/pidof $base1` if [ -n "$pid" ]; then killall $base1 fi base2=qss pid=`/bin/pidof $base2` if [ -n "$pid" ]; then killall $base2 fi base3=quicklauncher pid=`/bin/pidof $base3` if [ -n "$pid" ]; then killall $base3 fi base4=fluidlauncher pid=`/bin/pidof $base4` if [ -n "$pid" ]; then killall $base4 fi export TSLIB_ROOT=/usr/local/tslib export TSLIB_TSDEVICE=/dev/input/event2 export TSLIB_TSEVENTTYPE=H3600 export TSLIB_CONFFILE=/usr/local/tslib/etc/ts.conf export TSLIB_PLUGINDIR=/usr/local/tslib/lib/ts export TSLIB_CALIBFILE=/etc/pointercal export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts export TSLIB_CONSOLEDEVICE=none export TSLIB_FBDEVICE=/dev/fb0 export QTDIR=/opt/qt-4.8.4/ export QT_QWS_FONTDIR=/opt/qt-4.8.4/lib/fonts export LD_LIBRARY_PATH=$QTDIR/plugins/qtopialmigrate/:$QTDIR/qt_plugins/imageformats/:$QTDIR/lib:/root/tslib/build/lib:$LD_LIBRARY_PATH export PATH=/bin:/sbin:/usr/bin/:/usr/sbin:/root/tslib/build/bin if [ -c /dev/input/event2 ]; then export QWS_MOUSE_PROTO="Tslib:${TSLIB_TSDEVICE}" if [ -e /etc/pointercal -a ! -s /etc/pointercal ] ; then rm /etc/pointercal /root/tslib/build/bin/ts_calibrate fi else export QWS_MOUSE_PROTO="MouseMan:/dev/input/mice" >/etc/pointercal fi export QWS_KEYBOARD=TTY:/dev/tty1 FB_SIZE=$(cat /sys/class/graphics/fb0/virtual_size) #export QWS_DISPLAY="LinuxFb:mmWidth76:mmHeight44:1" case "$FB_SIZE" in 800,480) export QWS_DISPLAY="LinuxFb:mmWidth91:mmHeight53:1" ;; 480,272) export QWS_DISPLAY="LinuxFb:mmWidth76:mmHeight44:1" ;; *) export QWS_DISPLAY="LinuxFb:mmWidth91:mmHeight53:1" ;; esac #export QWS_DISPLAY=:1 export HOME=/root/QtE4Home cd /opt ./QC -qws