Qt4.8.5在ARM9開發板上的移植
以前移植過qtopia-embedded-2.2.0,俗稱Qt/E,在早期的Qt框架中是使用X11桌面服務器系統,無法應用於嵌入式平台,為此產生了qtopia,qtopia2.2.0就是一款針對嵌入式小資源平台的GUI系統,他是直接操作嵌入式系統顯示設備的FramerBuffer,精簡高效。但這是一款過時的產品,奇趣公司在Qt的4.5.0的時候,將Qt/E納入了Qtopia,推出Qtopia4,可以使用在任何平台上,只需在編譯時做相應的配置,這次我們就將移植Qt4.8.5到S3C2440開發板。
主機環境:Ubuntu12.04 LTS
編譯器:arm-linux-gcc 4.4.3
開發板:JZ2440,Linux-2.6.32.12
一. 首先得搞定驅動的問題,主要是觸屏的驅動和LCD的驅動,我是直接將兩個驅動編譯進內核了,針對不同的開發板,驅動是不同的,LCD驅動可以直接移植,但是觸屏驅動需要自己寫,具體的驅動可以參考友善之臂的觸屏驅動。這里不再詳細贅述。
二. 編譯tslib庫:
由於Qt的運行會調用tslib的庫,所以先移植安裝tslib,下載tslib-1.4的壓縮文件,百度上到處都有下載的,下載后解壓,如果你使用的是4.4.3的編譯器的話,一定要注意配置。
解壓后進入目錄:
cd tslib
首先安裝autoconfig工具:
sudo apt-get install autoconf
sudo apt-get install automake
sudo apt-get install libtool
然后依次執行:
sudo ./autogen.sh
mkdir tmp
sudo echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache
sudo ./configure --host=arm-none-linux-gnueabi
--cache-file=arm-linux.cache --prefix=$(pwd)/tmp
CC=/usr/local/arm-tool/bin/arm-linux-gcc CXX=/usr/local/arm-tool/bin/arm-linux-g++
export CC=/usr/local/arm-tool/bin/arm-linux-gcc
export CXX=/usr/local/arm-tool/bin/arm-linux-g++
上面需要注意的就是一定要指定交叉編譯器的絕對路徑,我就是在這個地方弄了好長時間,編譯后的文件總是X86的,指定成絕對路徑就是交叉編譯器了,而且host選項必須是和編譯器名一致,而不是編譯器的鏈接名。
接下來:sudo make;然后sudo make install
這時就能看到tmp目錄下多了編譯后的庫文件。在開發板的根目錄的opt目錄中建立tslib,這個目錄將是tslib目錄的安裝位置,最好使用先使用nfs掛載根文件系統,這樣可以減少燒寫flash的次數,有利於保護開發板,將剛才tmp目錄下的所有文件全部拷貝過來,這里我選擇全部拷貝。
三:編譯移植Qt4.8.5
至此,tslib安裝結束,下面編譯Qt庫,下載qt-everywhere-opensource-src-4.8.5.tar.gz,官網有下載,下載后解壓進入目錄,先要配置,最好寫一個配置文件
vim autoconfig.sh
內容為:
#!/bin/sh
sudo ./configure \
-prefix /usr/local/qte-arm/ \
-force-pkg-config \
-opensource \
-confirm-license \
-release -shared \
-embedded arm \
-xplatform qws/linux-arm-gnueabi-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 \
其中的配置選項根據自己的需要添加或刪減,選項說明直接./configure --help就出來了,當然上面的可以直接拷貝。
然后sudo chmod autoconfig.sh 777增加可執行權限,最后sudo ./autoconfig.sh
即可配置,這里說明一點,-force-pkg-config選項增加后會有警告,直接忽略,但是如果不加的話,則會出錯,這個錯誤是谷歌了好長時間才解決的。
配置到一半的時候,肯定會彈出類似的錯誤,
The tslib functionality test failed!
You might need to modify the include and library search paths by editing QMAKE_INCDIR and QMAKE_LIBDIR in
/qt-embedded-linux-opensource-src-4.8.5-arm/mkspecs/qws/linux-arm-g++
沒關系,這個錯誤有兩個原因,一個是沒加額外的tslib的鏈接庫文件,還記得剛才編譯tslib時用的tmp目錄么,現在就要用了,還有一個就是編譯器要使用絕對路徑,這就是4.4.3版本坑爹的地方,我是試了好長時間才發現的,一開始以為是tslib編譯錯了,后來發現是編譯器要使用絕對路徑而不是環境變量。
打開mkspecs/qws/linux-arm-gnueabi-g++目錄下的qmake.conf文件,修改編譯器為絕對路徑,並添加剛剛那個tmp目錄中的庫目錄,也是絕對路徑,我的設置是:
主要是QMAKE_INCDIR和QMAKE_LIBDIR,對應於你自己編譯tslib的庫目錄。
然后重新sudo ./autoconfig.sh,
接下來,就是sudo make,這個過程是個很長的過程,make完了后,sudo make install,就會安裝到你設置的目錄下,就是-prefix /usr/local/qte-arm/配置選項的目錄,但是不知道為什么,我的配置了,他給我安裝到了usr的下的默認的目錄下了,默認的是/usr/local/Trolltech,但最后的提示確實我配置的目錄,顯得有點坑爹。至此編譯就結束了,一般是不會出錯的。在開發板的根文件系統的opt目錄下建立Qte目錄,
再進入Qt安裝目錄下,將其中的四個目錄:imports lib mkspecs plugins復制到,/opt/Qte下,也可將demos也復制過來,因為待會要測試,就使用他的程序了。
四. 測試:
將/opt/tslib/etc/下的ts.conf打開,將
# module_raw input一行前面的符號和空格去掉,注意空格也不能留。
配置環境變量:
export TSLIB_ROOT=/opt/tslib
export TSLIB_TSDEVICE=/dev/event0
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_PLUGINDIR=/opt/tslib/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_CONFFILE=/opt/tslib/etc/ts.conf
export POINTERCAL_FILE=/etc/pointercal
export TSLIB_CALIBFILE=/etc/pointercal
export QWS_SIZE=480x272
export QWS_MOUSE_PROTO=Tslib:/dev/event0
export QTDIR=/opt/Qte
export QPEDIR=/opt/Qte
export PATH=$QTDIR/bin:$PATH
export QWS_DISPLAY=LinuxFb:/dev/fb0
export LD_LIBRARY_PATH=$TSLIB_ROOT/lib:$QTDIR/lib:$LD_LIBRARY_PATH
export QT_QWS_FONTDIR=$QTDIR/lib/fonts
如果你的開發板剛剛的目錄設置和我一樣的話,可以直接使用,不同的話根據自己的設置配置,根據環境變量的名字應該能看出每個目錄代表什么,主要就是tslib和Qt的安裝目錄,同時配置屏幕的大小,我的是480X272的,還有就是輸入子系統的文件節點,基本都差不多的。OK,下面,將demos下的一個可執行文件隨便拷貝一個過來,先進入tslib的bin目錄,執行./ts_calibrate校准觸屏,然后執行一個Qt程序,./textedit -qws就可以看到打開了一個文本編輯器,./mainwindow -qws就可以打開一個窗口界面,
這些程序在demos目錄下需要拷貝到開發板上執行,執行成功則說明移植成功,接下來,編寫一個腳本文件,將上述環境變量的設置寫入腳本文件,開機執行,並且在/etc/init.d/rcS中寫入開機啟動Qt程序的命令,則開機即可看到優美的GUI界面了,OK。至此,移植完成。