Qt4.5.1移植mini2440解決7寸屏問題(移植筆記)
1.我的環境及所需資源:
PC機作業系統:fedora 9
交叉編譯工具:arm-linux-gcc-4.3.2.tar.gz arm920t-eabi.tgz(7寸屏下編譯qt-embedded-linux-opensource-src-4.5.1)
所需資源: tslib-1.4.tar.gz qt-embedded-linux-opensource-src-4.5.1.tar.gz
qt-x11-linux-opensource-src-4.5.1.tar.gz
# tar xzvf arm920t-eabi.tgz -C /
#gedit /root/.bashrc
這是編輯/root/.bashrc檔案,在最後一行 export PATH=$PATH:/usr/local/arm/4.3.2/bin
#export PATH=$PATH:/opt/toolchains/arm920t-eabi/bin
登出系統
#arm-linux-gcc -v 可以看到版本資訊
.....(部分內容省略)
gcc version 4.3.2
3,安裝tslib-1.4
這是個觸控式螢幕的庫檔案,據網上說qt4
把tslib-1.4.tar.gz放到/home目錄下
#tar xvzf tslib-1.4.tar.gz
#cd tslib
#./autogen.sh
#./configure --prefix=/home/mytslib/ --host=arm-linux ac_cv_func_malloc_0_nonnull=yes
#make
#make install
這樣以後可以看到/home/mytslib/下有了庫檔案,移植時會用到!先不詳細說明。
4.安裝qt-x11-linux-opensource-src-4.5.1.tar.gz
把qt-x11-linux-opensource-src-4.5.1.tar.gz放到/opt目錄下
#tar xvzf qt-x11-linux-opensource-src-4.5.1.tar.gz
#cd qt-x11-linux-opensource-src-4.5.1
#./configure
#gmake //過程很長,我用的三個多小時
#gmake install
這是安裝PC機上的qt4,方便設計,在PC機上能夠成功了,在交叉編譯就方便了!然後製作一個執行環境變數的檔案,方便改變環境變數設定,如下在當前資料夾下接著輸入
#gedit setenv-x11.sh
這時會跳出來一個編輯文字,在裡面輸入:
PATH=/usr/local/Trolltech/Qt-4.5.1/bin:$PATH
QTDIR=/usr/local/Trolltech/QT-4.5.2
MAINPATH=$QTDIR/man:$MAINPATH
LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
export PATH QTDIR MAINPATH LD_LIBRARY_PATH
然後儲存!在每次進入qt-x11-linux-opensource-src-4.5.1目錄中要 #source setenv-x11.sh
把環境變數設定好。
5,安裝qt-embedded-linux-opensource-src-4.5.1.tar.gz
把qt-embedded-linux-opensource-src-4.5.1.tar.gz放到/tmp目錄下
在安裝qt-embedded-linux-opensource-src-4.5.1.tar.gz之前先在根目錄下建立兩個目錄(即資料夾)如下步驟:
更改交叉工具鏈(注意7寸屏一定要改,不然執行QT程式會有段錯誤)
編輯/root/.bashrc檔案,在最後一行 #export PATH=$PATH:/usr/local/arm/4.3.2/bin
#cd / 進入根目錄
#mkdir mini2440 這裡準備存放qt-embedded-linux-opensource-src-4.5.1的庫檔案
最後要移植到開發板的。
#mkdir tslib 這裡準備放觸屏的庫檔案,最後也會移植到開發板。
好了,現在安裝qt-embedded-linux-opensource-src-4.5.1.tar.gz
#cd /tmp 確定qt-embedded-linux-opensource-src-4.5.1.tar.gz放到/tmp目錄下了才行
#tar xvzf qt-embedded-linux-opensource-src-4.5.1.tar.gz
#cd qt-embedded-linux-opensource-src-4.5.1.
mini2440內的空間有限,所以剪裁很多,注意最後的紅色部分是為了找到觸屏的庫檔案,然後
#./configure -prefix /mini2440 -release -shared -fast -pch -no-qt3support -qt-sql-sqlite -no-libtiff -no-libmng -qt-libjpeg -qt-zlib -qt-libpng -qt-freetype -no-openssl -nomake examples -nomake demos -nomake tools -optimized-qmake -no-phonon -no-nis -no-opengl -no-cups -no-xcursor -no-xfixes -no-xrandr -no-xrender -no-xkb -no-sm -no-xinerama -no-xshape -no-separate-debug-info -xplatform qws/linux-arm-g++ -embedded arm -depths 16 -no-qvfb -qt-gfx-linuxfb -no-gfx-qvfb -no-kbd-qvfb -no-mouse-qvfb -qt-kbd-usb -confirm-license -qt-mouse-tslib -I/home/duancp/mytslib/include -L/home/duancp/mytslib/lib
#gmake
#gmake install
這樣,嵌入式版本的qt4也裝成功了,若想進行交叉編譯,首先也得改變環境變數,所以也可以在當前目錄下建一個環境變數的檔案setenv-embedded.sh 如下:
#gedit setenv-embedded.sh
這時跳出一個編輯文字輸入:
PATH=/mini2440/bin:$PATH
QTDIR=/mini2440
MAINPATH=$QTDIR/man:$MAINPATH
LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
export PATH QTDIR MAINPATH LD_LIBRARY_PATH
儲存退出。每次進行qt4-embedded的交叉編譯前先# source setenv-embedded.sh
7,例子 hello world!
A,PC機下編譯:
進入PC機中/opt/qt-x11-linux-opensource-src-4.5.1
#cd /opt/qt-x11-linux-opensource-src-4.5.1.
#source setenv-x11.sh 改變環境變數,設定為適合pc機的開發環境
#mkdir hello
#cd hello 進入hello目錄
#vi hello.cpp 編寫hello world 程式,在hello.cpp中輸入以下程式碼:
#include <QApplication>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication app(argc,argv);
QPushButton b("Hello World !");
b.show();
QObject::connect(&b,SIGNAL(clicked()),&app,SLOT(quit()));
return app.exec();
}
儲存退出。然後在當前目錄下繼續執行以下命令:
#qmake -project
#qmake
#make
#ls
這時在這個目錄下可以看到生成了可執行檔案hello,然後
#./hello
你會發現,跳出了一個hello world的對話方塊,這樣一個簡單的介面就成功了
B,交叉編譯
首先把/opt/qt-x11-linux-opensource-src-4.5.1下的hello目錄拷到/tmp/qt-embedded-linux-opensource-src-4.5.1目錄下
#cp -fr /opt/qt-x11-linux-opensource-src-4.5.1/hello /tmp/qt-embedded-linux-opensource-src-4.5.1
#cd /tmp/qt-embedded-linux-opensource-src-4.5.1
#source setenv-embedded.sh 這一步很關鍵,否則你交叉編譯不了,改變的環境變數
#cd hello
#make clean
#qmake -project 重新生成.pro
#qmake 重新生成適合交叉編譯的Makefile
#make
#ls
這時候,你發現有hello 的可執行檔案,原來的hello已經被替換掉了,現在這個hello檔案是適合開發板執行的!這時候你如果執行./hello是不會有介面的,把它放到開發板的檔案系統下才會有介面(前提是設定好了開發板的環境變數,具體看下一步)
C,移植到開發板
把剛才在/tmp/qt-embedded-linux-opensource-src-4.5.1/hello下生成的hello可執行檔案移植到開發板的根目錄下(可自己選擇存放位置),你可以用串列埠傳送,優盤傳送或者nfs,不管怎樣,最後的結果是在超級終端下可以看到開發板的檔案系統中有hello,我是放在了根目錄下,然後在超級終端下操作開發板:
#chmod +x hello 增加它的可執行許可權
#export QTDIR=/mini2440 依次輸入設定開發板環境變數的東西
#export T_ROOT=/tslib
#export PATH=$QTDIR/bin:$PATH
#export TSLIB_CONSOLEDEVICE=none
#export TSLIB_FBDEVICE=/dev/fb0
#export TSLIB_TSDEVICE=/dev/input/event0
#export TSLIB_PLUGINDIR=$T_ROOT/lib/ts
#export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf
#export TSLIB_CALIBFILE=/etc/pointercal
#export QWS_MOUSE_PROTO=tslib:/dev/input/event0
#export LD_LIBRARY_PATH=$T_ROOT/lib:$QTDIR/lib
但目前為止,環境變數設定成功 可以通過echo命令檢視是否成功,如echo $QTDIR
最後執行:
#./hello -qws 你會發現開發板的螢幕上上有了hello world的介面了!
export PATH=$PATH:/opt/toolchains/arm920t-eabi/bin
登出系統
#arm-linux-gcc -v 可以看到版本資訊
.....(部分內容省略)
gcc version 4.1.2
6.製作庫檔案
前面介紹了在根檔案系統下建立兩個目錄mini2440和tslib1.4.經過第5步後,mini2440內已經有了庫檔案,現在把觸屏的庫檔案移植到tslib目錄。
#cd /home/mytslib 進入觸屏庫檔案所在地
#cp -fr lib /tslib 把lib目錄放到根目錄的tslib目錄下
在根檔案的mini2440檔案中除了有lib目錄,還有bin,examples等目錄,但是移植到開發板的檔案只需要mini2440下的lib目錄。Lib目錄有30多兆,若太大,可以刪除/lib/fonts中的一些字型!我的沒有刪除任何字型!我的mini2440是64兆的,剩餘大概13兆了,顯然不夠,於是我把它自帶的Qt2的庫檔案及有關qt2的檔案全刪除了(所以現在沒有辦法執行qt2),剩餘47兆,足夠執行qt4.那麼接下來解釋移植的過程了:
首先,在超級終端下操作開發板,在開發板的根目錄下建立兩個目錄mini2440和tslib,一樣的方法:
#mkdir mini2440 注意這是對開發板的操作,不再是PC機了!
#mkdir tslib
然後,不你是用什麼方法,要把PC機根目錄下/mini2440裡的lib目錄(整個檔案件)(其他的如bin等都不用)全部拷到開發板根目下的/mini2440中,同理把要把PC機根目錄下/tslib裡的lib目錄(整個檔案件)全部拷到開發板根目下的/tslib中.
你可以用串列埠傳輸 ,或者優盤傳輸,或者nfs等,最終的效果是開發板根目錄下的/mini2440中有QT4的lib,/tslib有觸屏的lib.
最後,就是設定開發板的環境變量了:在超級終端裡的命令列下輸入:
#export QTDIR=/mini2440
#export T_ROOT=/tslib
#export PATH=$QTDIR/bin:$PATH
#export TSLIB_CONSOLEDEVICE=none
#export TSLIB_FBDEVICE=/dev/fb0
#export TSLIB_TSDEVICE=/dev/input/event0
#export TSLIB_PLUGINDIR=$T_ROOT/lib/ts
#export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf
#export TSLIB_CALIBFILE=/etc/pointercal
#export QWS_MOUSE_PROTO=tslib:/dev/input/event0
#export LD_LIBRARY_PATH=$T_ROOT/lib:$QTDIR/lib
2.安裝交叉編譯環境:
把arm-linux-gcc-4.3.2.tar.gz放到/tmp 目錄下
# tar xzvf arm-linux-gcc-4.3.2.tar.gz -C /