主機系統:Debian 5.0
主機編譯器:gcc/g++爲4.1.3
交叉編譯器:arm-linux-gcc/g++3.4.5-glibc-2.3.6
軟件資源:qt-embedded-linux-opensource-src-4.5.1.tar.gz
qt-x11-opensource-src-4.5.1.tar.gz
tslib-1.4.tar.gz
目標板:博創UP-TECH S2410
1. 安裝X11的相關庫文件和開發包
在編譯時會生成一些在主機上運行的工具,要用到X11的一些頭文件、庫,所以需要安裝X11開發包。
#sudo apt-get -y install x-dev libx11-dev xlibs-static-dev x11proto-xext-dev libxext-dev libqt3-mt-dev
#sudo mkdir -p /usr/X11R6/include
#sudo cp -rf /usr/include/X11 /usr/X11R6/include(參考韋東山《嵌入式Linux應用開發完全手冊》)
2.安裝交叉編譯器arm-linux-gcc-3.4.5
(1) 新建安裝目錄:#mkdir /usr/local/arm
(2) 解壓arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2
把arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2複製在目錄/usr/local/arm下,在終端中進行如下操作:
#cd /usr/local/arm
#tar jxvf arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2
等待解壓完成。
(3) 導入環境變量
export PATH=$PATH:/usr/local/arm/3.4.5/bin
或者:編輯一個導入環境變量的腳本(方便以後使用):
#vi ArmEnv
1 #!/bin/sh
2 export PATH=$PATH:/usr/local/arm/3.4.5/bin
#chmod +x ArmEnv //增加可執行權限
#arm-linux-gcc -v
這樣就把交叉編譯器的地址變量設置好了,但這樣設置路徑變量的方法只在此終端中生效,對其他的終端無效,若要設置對所有用戶所有終端都有效的路徑變量,在/etc/profile 中最後一行添加“export PATH=/usr/local/arm/3.4.5/bin:$PATH”(不推薦這種方式)。
3.編譯安裝qt-x11-opensource-src-4.5.1
qt-x11版本可以產生Qt開發工具,如designer、lingust等,最重要的是可以得到qvfb,嵌入式的開發有了qvfb,就可以不需要實際的開發板,也可以開發Qt應程序。qt-embedded版本就是專門用於嵌入式方面的版本。
將qt-x11-opensource-src-4.5.1.tar.gz複製到/root/local/qt目錄下,進行解壓,在終端中進行如下操作:
#cd /root/local/qt
#tar zxvf qt-x11-opensource-src-4.5.1.tar.gz
解壓完成後,得到/root/local/qt/qt-x11-opensource-src-4.5.1目錄。下面就開始進行編譯了。
進入/root/local/qt/qt-x11-opensource-src-4.5.1目錄,進行編譯安裝。在終端中進行如下操作:
#./configure –qvfb
#make
#cd tools/qvfb
#make
#cd ../..
#make install
經過相當長的時間完成後,會在/usr/local目錄下生成一個Trolltech目錄,形成/usr/local/Trolltech目錄,這是qt-x11-opensource-src-4.5.1安裝後所在的目錄,進入/usr/local/Trolltech會看到一個Qt-4.5.1的目錄,將/root/local/qt/qt-x11-opensource-src-4.5.1/tools/qvfb目錄下的qvfb相關文件拷貝到/usr/local/Trolltech/Qt-4.5.1/bin目錄下,在終端中操作(確定當前目錄是/root/local/qt/qt-x11-opensource-src-4.5.1)。
#cp tools/qvfb/qvfb* /usr/local/Trolltech/Qt-4.5.1/bin
至此,qt-x11-opensource-src-4.5.1就編譯安裝成功了
你就可以使用/usr/local/Trolltech/Qt-4.5.1下的Qt進行編程開發了。
===============================================================================
4. 這裏,qt-embedded有兩個複製:qt-embedded-linux-opensource-src-4.5.1-x86和qt-embedded-linux-opensource-src-4.5.1-arm,根據他們的名字可以知道前者是適合x86架構的,後者適合arm架構爲什麼需要兩個呢?如果有開發板的話,可以只編譯qt-embedded版本成arm架構的就可以了,但是很多時候用qvfb的話,開發會方便很多,所以多編譯一個x86架構的也不錯。這裏是否有些疑問,qt-x11也是適合x86結構的,這不是和qt-embedded重複了嗎?答案是這樣的,qt-embedded版本只能在嵌入式板子上面運行,編譯成x86架構的程序也只能在x86的嵌入式板子上跑(這裏咱們用的PC機其實是也可以看成嵌入式開發板只不過它是x86架構的)。前面說過,我們需要qvfb來開發,但是qvfb只能執行x86架構的應用程序,所以需要讓qt-embedded生成關於x86的庫和其他文件。而將qt-embedded編譯成arm,又是爲什麼呢?道理很簡單,我最終的qt應用程序需要在arm架構上面運行,當然需要這方面的庫,所以編譯成arm也就順理成章了。好了,現在簡單的總結一下,首先,使用qt-x11提供的庫和開發工具開發出qt應用程序,然後使用qt-embedded關於x86庫和工具再次編譯我們開發qt應用程序,這是所得到的可執行文件就可以在qvfb上運行了,最後,使用qt-embeddedd的arm庫再次編譯就可以得到在arm上能運行的可執行程序。很明顯,如果有開發板,第二步是可要可不要的(最好是要),如果沒有開發板的話,第三步也就沒必要了,這樣就不需要將qt-embedded編譯成適合arm架構的。
5.編譯配置QtEmbedded-4.5.1-x86版本
解壓qt-embedded-linux-opensource-src-4.5.1.tar.bz2在路徑/root/local/qt路徑下
# tar xjvf qt-embedded-linux-opensource-src-4.5.1.tar.bz2
修改解壓後的文件夾名稱
#mv qt-embedded-linux-opensource-src-4.5.1 qt-embedded-linux-opensource-src-4.5.1-x86
進入/root/local/qt/qt-x11-opensource-src-4.5.1-x86目錄,進行編譯安裝。在終端中進行如下操作:
#cd /root/local/qt/qt-x11-opensource-src-4.5.1-x86
./configure -prefix /usr/local/Trolltech/QtEmbedded-4.5.1-x86 -embedded x86 –qvfb
#make(或windowns系統下gmake)
#make install(或gmake install)
OK,QtEmbedded-4.5.1-x86就編譯好了。
在需要x86版本QT編譯時建立環境變量:
export QTEDIR=/usr/local/Trolltech/QtEmbedded-4.5.1-x86/
export PATH=/usr/local/Trolltech/QtEmbedded-4.5.1-x86/bin/:$PATH
export LD_LIBRARY_PATH=/usr/local/Trolltech/QtEmbedded-4.5.21-x86/lib/:$LD_LIBRARY_PATH
這裏也寫成腳本:
#vi setX86env
1 #!/bin/sh
2 export QTEDIR=/usr/local/Trolltech/QtEmbedded-4.5.1-x86/
3 export PATH=/usr/local/Trolltech/QtEmbedded-4.5.1-x86/bin:$PATH
4export LD_LIBRARY_PATH=/usr/local/Trolltech/QtEmbedded-4.5.1-x86/lib/:$LD_LI BRARY_PATH
記得加上執行權限。
如果要添加觸摸屏支持還需要安裝tslib,現在最高版本爲1.4(筆者開發時)。下面介紹一下tslib1.4編譯安裝過程。
6.編譯安裝tslib1.4
安裝編譯過程需用到的程序
# apt-get install autoconf(或autoconf2.13)
# apt-get install automake
# apt-get install libtool
將tslib1.4解壓到/home下
#./autogen.sh
#./configure --prefix=/home/zyx/project/mytslib/ --host=arm-linux ac_cv_func_malloc_0_nonnull=yes
#make
#make install-strip //生成瘦身應用程序和庫
注意:/home/zyx/project/mytslib/爲tslib1.4安裝目錄在裝QtEmbedded-4.5.1-arm版本時需要用到此目錄,打包mytslib。
# tar czvf mytslib.tar.gz mytslib
下載到開發板上/usr/local目錄解壓。
#tar xzvf mytslib.tar.gz
設置環境變量,校準觸摸屏。修改開發板上創建/bin/ts.sh文件。
#!/bin/sh
export QTDIR=/usr/local/Qtembedded-4.5.1
export QPEDIR=/usr/local/Qtembedded-4.5.1
export PATH=$PATH:$QTDIR/bin
export TSLIB_ROOT=/usr/local/tslib //tslib主目錄
export TSLIB_TSDEVICE=/dev/event0 //觸摸屏設備節點
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf //觸摸屏配置文件
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts //觸摸屏在進行AD轉換時用到的插件
export TSLIB_CALIBFILE=/etc/pointercal //生成的校驗文件存放目錄
export TSLIB_FBDEVICE=/dev/fb0 //觸摸屏framebuff設備節點
export QWS_SIZE=640x480 //根據自己觸摸屏大小進行設置,這條也可不加
export QWS_DISPLAY="LinuxFb:mmWidth100:mmHeight130:0"//如果不加這條會出現觸摸屏字體很小的現象(不管在程序中設置多大的字體)
export LD_LIBRARY_PATH=$QPEDIR/lib:$TSLIB_ROOT/lib:$LD_LIBRARY_PATH
export QWS_MOUSE_PROTO="Tslib:/dev/event0"
export TSLIB_CONSOLEDEVICE=none
export QT_QWS_FONTDIR=$QPEDIR/lib/fonts //設置字體,否則程序顯示亂碼
export QT_PLUGIN_PATH=$QTDIR/plugins/
注意:
(1) 上面這些設置一定要仔細寫,否則會出現這樣那樣的問題,筆者曾出現露掉字體問題。總之這個一定要根據自己的配置寫正確。
(2) 檢查ts.conf 參數是否設置正確,下面是我的配置。
module_raw input
module pthres pmin=1
module variance delta=30
module dejitter delta=100
module linear
(3) 如果是靜態添加節點的話,觸摸屏設備節點一定要建正確。
#mknod ts0 c 13 128
(4) 觸摸屏的前提是你的觸摸屏驅動已經寫好,並加載進了內核.你可以測試有沒有加載觸摸屏驅動,cat /dev/touchscreen/0raw) ,點擊觸摸屏,看終端有無顯示,若有則表明正確。
(5) 修改文件ts.conf將其他不需要的都刪掉,空格也都刪掉,因爲配置文件有大小限制(好像是不大於150k)。否則有可能會提示: selected device is not a touchscreen I understand錯誤信息
在開發板/usr/local/mytslib/bin目錄下執行校準觸摸屏程序:# ./ts_calibrate
會在/etc目錄生成一個:pointercal觸摸屏效準的必須文件,也可以運行此目錄下的其他程序進行測試。
特別注意:如果是掛載根文件系統,在/etc/exports文件中發佈權限要設置正確,否則可能會出現雖然已經校驗但卻無法生成pointercal文件。
7. 編譯安裝QtEmbedded-4.5.1-arm版本
解壓qt-embedded-linux-opensource-src-4.5.1.tar.bz2(在路徑/root/local/qt路徑下),進入/root/local/qt/ qt-embedded-linux-opensource-src-4.5.1-arm目錄,進行編譯安裝。在終端中進行如下操作:
# tar xjvf qt-embedded-linux-opensource-src-4.5.1.tar.bz2
#mv qt-embedded-linux-opensource-src-4.5.1 qt-embedded-linux-opensource-src-4.5.1-arm
# cd qt-embedded-linux-opensource-src-4.5.1-arm
配置選項編譯:
./configure -release -shared -fast -no-largefile -qt-sql-sqlite -no-qt3support -no-xmlpatterns -no-mmx -no-3dnow -no-sse -no-sse2 -no-svg -no-webkit -qt-zlib -qt-gif -qt-libtiff -qt-libpng -qt-libmng -qt-libjpeg -make libs -nomake tools -nomake examples -nomake docs -nomake demo -no-nis -no-cups -no-iconv -no-dbus -no-openssl -xplatform qws/linux-arm-g++ -embedded arm -little-endian -qt-freetype -depths 16,18 -qt-gfx-linuxfb -no-gfx-transformed -no-gfx-multiscreen -no-gfx-vnc -no-gfx-qvfb -qt-kbd-usb -no-glib -qt-mouse-tslib -I/usr/local/tslib/include -L/usr/local/tslib/lib
解釋:-fast:快速編譯,加此項不會生成中間文件,如果你確定你能一次編譯通過的話可以加上,否則重新編譯會浪費很多時間。
-qt-sql-sqlite:sqlite數據庫選項,如果要編寫的程序需要數據庫就必須加上,或者使用插件的形式,但是兩者只能選一個,否則編寫的程序會出現加載不上驅動的現象。
注意:最後兩個路徑如果設置不對則生成的庫文件沒辦法支持觸摸屏
假如提示mkspec/qws/linux-arm-g++/qmake.conf中QMAKE_INCDIR和QMAKE_LIBDIR錯誤信息
將qmake.conf文件中加入
QMAKE_INCDIR =/home/zyx/project/mytslib/include
QMAKE_LIBDIR =/home/zyx/project/mytslib/lib
重新./configure
#make
#make install
如果在編譯的過程中出錯,在重新make前需要先執行make clean,然後再./configure,再執行make的操作。
安裝默認目錄在/usr/local/Trolltech/QtEmbedded-4.5.1-arm中。
8. 打包編譯安裝好的QtEmbedded庫文件以備以後使用
# tar czvf QtEmbedded-4.5.1-arm.tar.gz QtEmbedded-4.5.1-arm
在編譯ARM版QT應用程序前建立環境變量:
export QTEDIR=/usr/local/Trolltech/QtEmbedded-4.5.1-arm/
export PATH=/usr/local/Trolltech/QtEmbedded-4.5.1-arm/bin/:$PATH
export LD_LIBRARY_PATH=/usr/local/Trolltech/QtEmbedded-4.5.1-arm/lib/:$
LD_LIBRARY_PATH
編譯簡單的QT程序或者QtEmbedded-4.5.1-arm自帶的程序例子掛載到開發板執行看是否成功,一般會提示找不到fonts libQtGui.so.4 libstdc++.so.6 libQtNetwork.so.4 libQtCore.so.4 librt.so.1等庫文件。從/usr/local/trolltech/QtEmbedded-4.5.2-arm/lib 和 /usr/local/arm/3.4.5/arm-linux/lib中拷貝到開發板上即可。
2010-06-16 整理
問題1:
./ts_calibrate: error while loading shared libraries: libts-0.0.so.0: cannot open shared object file: Error 40
./ts_calibrate: error while loading shared libraries: libts-0.0.so.0: cannot ope
n shared object file: No such file or directory
解決辦法:
#echo $LD_LIBRARY_PATH //查看lib路徑,
#export LD_LIBRARY_PATH=$T_ROOT/lib
問題2:
ts_open: No such file or directory
解決辦法:
#export TSLIB_TSDEVICE=/dev/input/event0 //觸摸屏設備路徑
問題3:
Couldnt open tslib config file: No such file or directory ts_config: Illegal seek
解決辦法:
#export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf
問題4:
Couldnt load module pthres
No raw modules loaded.
ts_config: Success
解決辦法:
#export TSLIB_PLUGINDIR=$T_ROOT/lib/ts
問題5:
No raw modules loaded.
Ts_config: No such file or directory
解決辦法:
修改$T_ROOT/etc/ts.conf, 至少放開一個module_raw, 並去掉前面空格