歡迎您光臨本站 登入註冊首頁

Qtopia for arm編譯

admin @ 2014-03-25 , reply:0

概述

一、相關工具以及軟體包:Cross-compilerToolchains        提供arm交叉編譯工具e2fsp……

一、相關工具以及軟體包

  • Cross-compiler Toolchains         提供arm交叉編譯工具
  • e2fsprogs-1.35.tar.gz                   用於編譯生成libuuid庫
  • tmake-1.11.tar.gz                         生成makefile
  • tslib.tar.bz2                                   觸摸屏庫
  • qt-embedded-2.3.7.tar.gz              Qt/Embedded
  • qt-x11-2.3.2.tar.gz                         Qt/X11,提供uic,qvfb(不必)
  • qtopia-free-1.7.0.tar.gz                 Qtopia

將這些工具和軟體包保存到/qte_arm/目錄,並解壓縮。注意Toolchains已保存到/opt/xscalev1/bin。

二、安裝tmake
       tmake用於交叉編譯生成qt應用程序的makefile, 也可用於生成qt的本地makefile,區別在於設置TMAKEPATH路徑的不同,一個用於arm,一個用於x86。
       注意:tmake機器上本來就有,但是需要1.11以上版本,可用tmake –v查看版本信息。

# cd /qte_arm
# tar xvfz tmake-1.11.tar.gz
# vi tmake-1.11/lib/qws/linux-arm-g++/tmake.conf
       TMAKE_LINK=arm-linux-g++     //將原來的arm-linux-gcc改成arm-linux-g++
       TMAKE_LINK_SHLIBS=arm-linux-g++      (不知道為什麼要改,也不知道不改行不行)

設置tmake環境變數:

# export PATH=/qte_arm/tmake-1.11/bin:$PATH
# export TMAKEDIR=/qte_arm/tmake-1.11
# export TMAKEPATH=/qte_arm/tmake-1.11/lib/qws/linux-arm-g++

另:由於qtopia編譯過程很繁瑣而且一般不能一次通過,所以也可將環境變數的設置寫成腳本,腳本中也要寫export。若腳本名為setenviroment,執行時應為:source setenviroment

三、安裝e2fsprogs:為arm編譯libuuid庫。

# cd e2fsprogs
# ./configure  –enable-elf-shlibs  –build=i386-linux  –host=arm-linux –with-cc=/opt/xscalev1/bin/arm-linux-gcc  –with-linker=/opt/xscalev1/bin/arm-linux-ld
# make

       其中lib目錄下的libuuid.so.1.2、libuuid.so.1、libuuid.so即是我們要編譯的庫,必須檢查是否出現以及相應格式,否則說明編譯不成功。

四、編譯觸摸屏共享庫tslib
       Qt/Embedded只支持滑鼠和鍵盤的操作,但在大部分嵌入式系統中利用觸摸屏,所以用戶必須對觸摸屏的相關操作編譯成共享庫或靜態庫。

  1. 解壓實驗光碟提供的tslib.tar.bz2文件;
  2. 編譯觸摸屏庫;
  3. 將觸摸屏相關的頭文件複製到qte-2.3.7/include文件夾中;
  4. 將編譯好的觸摸屏庫文件複製qte-2.3.7/lib文件夾中;
    [root@~qte_arm]#tar -jxf tslib.tar.bz2
    [root@~qte_arm]#cd tslib
    [root@~qte_arm]#export CC=arm-linux-gcc
    [root@~qte_arm]#./autogen.sh
    [root@~qte_arm]#./configure --host=arm-linux
    [root@~qte_arm]#make
    [root@~qte_arm]#cp -a src/.libs/*  /qte_arm/qte-2.3.7/lib/
    [root@~qte_arm]#cp -a plugins/.libs/*.so  /qte_arm/qte-2.3.7/lib/
    [root@~qte_arm]#cp -f src/*.h  /qte_arm/qte-2.3.7/include/ 
  5. 修改qte-2.3.7交叉編譯環境參數文件使其增加對觸摸屏的支持;

    用vi編輯/qte_arm/qte-2.3.7/configs/linux-arm-g++-shared文件,將SYSCONF_LIBS = -lm 修改為SYSCONF_LIBS = -lm -lts,然後保存修改後的文件。在編譯qte-2.3.7源代碼過程中使用觸摸屏共享庫。 

五、安裝Qt/Embedded
       Qt/E已經解壓到/qte_arm/qte-2.3.7,Qtopia解壓到/qte_arm/qtopia-1.7.0。
    準備:修改qte-2.3.7滑鼠操作源代碼src/kernel/qwsmouse_qws.cpp
       雖然qte-2.3.7支持滑鼠操作,但是源代碼src/kernel/qwsmouse_qws.cpp中讀取滑鼠數據函數readMouseData()讀取的數據與開發板的觸摸屏設備驅動輸出的數據不匹配,所以用戶必須修改讀取滑鼠數據函數readMouseData()。

# cp /emdoor/Emeddoorv1.3/Qt/patch/qt_patch/qt-2.3.7-arm/src/kernel/qwsmouse_qws.cpp 到相應目錄下。
# cd /qte_arm/qte-2.3.7
# export QPEDIR=../qtopia-1.7.0
# export QTDIR=$PWD
# export PATH=$PWD/bin:$PATH
# export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH
# cp $QPEDIR/src/qt/qconfig-qpe.h  src/tools/
# ./configure –qconfig qpe –xplatform linux-arm-g++ -shared –no-xft

選擇支持16depths色彩,不使用qvfb。實際上選擇qvfb也無妨。

# make

如果編譯成功,系統輸出:
The Qt library is now built in ./lib
    The Qt examples are built in the directories in ./examples
    The Qt tutorials are built in the directories in ./tutorial
……
Enjoy!   - the Trolltech team 
 
  編譯生成的共享庫libqte.so.2.3.7即是我們需要的qte庫,保存在Qt目錄的/lib文件夾中,通過查看/lib文件夾的文件可以確認編譯是否成功。

#cd $QTDIR/lib
#ls
libqte.so libqte.so.2 libqte.so.2.3 libqte.so.2.3.7

利用file命令確認生成的共享庫是否適合目標平台即ARM平台的二進位目標文件。

#file libqte.so.2.3.7
libqte.so.2.3.7:ELF 32-bit LSB shared object,ARM,version 1(ARM),not stripped

注意:有人說要編輯src下的Makefile,add "-DQWS_CUSTOMTOUCHPANEL" into "QT_CXXFLAGS_OPT",然後make sub-src。暫時未明。

六、安裝Qt/X11
       編譯qt-x11-2.3.2是為了得到uic和qvfb,uic在編譯qtopia時要用到,因此要用gcc/g++編譯,而不要用arm-linux-gcc/g++編譯。Qvfb則用於在沒有幀緩衝結構的x86處理器系統和X窗口環境下,模擬出虛擬的幀緩衝,以便用於在PC上進行qtopia應用開發時的模擬。
       實際上RedHat 9.0系統中已經裝有QT,但是編譯qtopia時不能使用比其自身更高版本的uic。
       # cd  /qte_arm/qt-2.3.2
       # export QTDIR=$PWD
       # export PATH=$PWD/bin:$PATH
       # export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH
       # ./configure –no-xft
       # make
       # make –C tools/qvfb 或者# cd tools/qvfb # make
       # cp tools/qvfb/qvfb  bin     //將上一步生成的可執行文件qvfb拷到bin目錄下。
       //# cp bin/uic $QPEDIR/bin  //這一行不用。
       # cp bin/uic $QTEDIR/bin 

七、Build Qtopia
       # cp /qte_arm/e2fsprogs/lib/libuuid.so* /opt/xscalev1/lib
# cp /qte_arm/e2fsprogs/lib/libuuid.so* /opt/xscalev1/arm-linux/lib
       //這裡將libuuid.so*拷到交叉編譯工具的通用庫中。實際上沒有必要隨便改動公用庫,因為在建立x86下的Qtopia環境時也要用到相同名字的庫,但是針對的處理器結構不同,用file命令可以查看。這是由於在編譯e2fsprogs使用的配置參數不一樣。
或者:
# export LD_LIBRARY_PATH=/qte_arm/qtopia-1.7.0/lib:$LD_LIBRARY_PATH
       # cp /qte_arm/e2fsprogs/lib/uuid/libuuid.a  /qte_arm/qtopia-1.7.0/lib
       //這樣做時copy的必須是libuuid.a文件,然後在編譯qtopia時會利用libuuid.a生成libuuid.so*,這樣得到的libuuid.so*才是可用的。
       # cp –av /qte_arm/e2fsprogs/lib/uuid  /qte_arm/qtopia-1.7.0/include
       # export QTDIR=$QTEDIR
       # export PATH=$PWD/bin:$PATH
       # export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH
       # cd src
       # ../configure –xplatform linux-arm-g++
       # make
       //很奇怪,用./configure –help查看,發現只有-platform選項而沒有-xplatform選項,不過這樣做居然沒有報錯。也有人說要先轉到src/目錄下再進行configure,然後在此目錄下make,沒試過。 

八、問題以及解決
1.qwsmouse_qws.cpp在編譯qte-2.3.7時出錯
 
       看error信息:
       kernel/qwsmouse_qws.cpp:1675:error:invalid use of undefined type ‘struct tsdev’
       /qte_arm/qte-2.3.7/include/tslib.h:20:error:forward declaration of ‘struct tsdev’
       可以知道出錯發生在文件qwsmouse_qws.cpp和tslib.h,另外出錯核心在於’struct tsdev’的使用,因此要查看相應文件的相應部分。發現qwsmouse_qws.cpp中include了tslib.h頭文件,並且使用了變數’struct tsdev’,其中並沒對它進行聲明和定義。查看tslib.h,其中對’struct tsdev’進行了聲明,但並沒有定義,並且下面還使用了該變數。qwsmouse_qws.cpp中只包含了對’struct tsdev’聲明的頭文件,但沒有包含任何對’struct tsdev’定義的文件。因此才出錯,在qwsmouse_qws.cpp中報錯為變數沒定義,在tslib.h中報錯為前向聲明(大概就是在定義變數之前對變數進行聲明和使用,這在使用一些指針變數、結構體時,由於在使用時沒有定義,就不知道其所佔存儲空間大小)。
       因此,解決辦法就是修改tslib.h文件,將對’struct tsdev’定義的頭文件包含進來。經查看,在相同目錄下的tslib-private.h文件中對’struct tsdev’進行了定義,因此可在tslib.h文件中加入“# include <tslib-private.h>”一行,這樣就不會有forward declaration的錯誤,同時由於qwsmouse_qws.cpp包含了tslib.h,因而也就不會有變數沒定義的錯誤。 

2.tslib的鏈接問題
       如果編譯Qtopia時,tslib沒有正確鏈接上,則會發生如下錯誤:
 
       Warning信息:
       /qte_arm/qtopia-1.7.0/lib/libqtopia.so需要的libuuid.so.1找不到。說明鏈接路徑有問題。將libuuid.so*拷到可鏈接的庫目錄下,或者拷到/qte_arm/qtopia-1.7.0/lib下,但是要把它加入LD_LIBRARY_PATH中。但奇怪的是這樣並不能解決問題(有可能是之前環境變數設置腳本中沒寫export而導致實際上並沒有將/qte_arm/qtopia-1.7.0/lib成功加入到LD_LIBRARY_PATH中去,可用env命令查看當前的環境變數進行檢查)。是不是應該拷的是libuuid.a呢?的確如此,見前面(已經過實踐)不過一種真正能解決問題的辦法是Build Qtopia部分的開頭陰影區兩行。
       Error信息:
       由於tslib(touch screen library)沒有鏈接上。說是libqte.so中有undefined reference to ‘ts_close’等。說明在編譯qte時生成的庫文件libqte.so可能就沒有鏈接上tslib。
       ①修改了qte-2.3.7/src下的Makefile(據說是tmake生成的?),將下面一行:
       ########## Compiler, tools and options
LIBS = $(SUBLIBS) $(SYSCONF_QTLIBS) 
       后加上 –L ../lib –lts,即改為:LIBS = $(SUBLIBS) $(SYSCONF_QTLIBS) –L ../lib –lts
然後對qte重新編譯,然後再編譯qtopia即可。
       -L應該是指定鏈接目錄,../lib即qtopia-1.7.0/lib,事先已經將tslib共享庫文件copy到該目錄下,-lts是指支持對tslib共享庫的鏈接。大概如此,具體還要進一步學習Makefile的相關知識。不知道-L后不指定目錄行不行?
       可參考:http://www.qtcn.org/bbs/read.php?tid=3728
       ②第二次實踐,突發奇想,在修改/qte_arm/qte-2.3.7/configs/linux-arm-g++-shared文件時,不但將# Linking applications下的SYSCONF_LIBS= -lm 修改為SYSCONF_LIBS = -lm -lts,還將# Linking shared libraries下的SYSCONF_LINK_SHLIB = arm-linux-gcc后加了-lts。這樣就一次通過了,沒有出現上述的tslib鏈接問題,也不用修改qte-2.3.7/src下的Makefile。

[參考資料]:
①     《Porting Qtopia to Pxa272》,周緒宏,http://zxuhong.blogchina.com/4631068.html
②     《實驗十一 QT移植實驗》,李外雲,Emdoor PXA270 Linux實驗文檔
③ 《無人值守安全監控系統(家庭版)》,胡柏炅
④ 《Building Qtopia PDA OEM for arm》,http://doc.trolltech.com/qtopia2.1/html/qtopia-build-oem-pda-arm.html


[admin via 研發互助社區 ] Qtopia for arm編譯已經有2504次圍觀

http://cocdig.com/docs/show-post-42140.html