1. 程式人生 > >交叉編譯qt-everywhere-opensource-src-4.7.3,Qte編譯

交叉編譯qt-everywhere-opensource-src-4.7.3,Qte編譯

環境:

  • 編譯鏈:arm-Linux-gcc version 4.4.1
  • busybox版本:busybox-1.15.1
  • tslib版本:tslib-1.4
  • QTE版本:qt-everywhere-opensource-src-4.7.3
  • Linux發行版: Core release 6 (Zod)

qt-everywhere-opensource-src-4.7.3是Qt提供的一套Embedded下的類庫,方便在Embedded的開發平臺使用Qt,下面講的就是如何交叉編譯qt-everywhere.1:下載qt-everywhere-opensource-src-4.7.3原始碼,下載的話直接谷歌百度,下載之後然後解壓,本人在root目錄下解壓

[[email protected] ~]# tar zxf qt-everywhere-opensource-src-4.7.3.tar.gz

2:進入目錄,執行配置:

[[email protected] ~]# ./configure -opensource -embedded arm -xplatform
qws/linux-arm-g++ -no-webkit -qt-libtiff -qt-libmng
-qt-mouse-tslib -qt-mouse-pc -no-mouse-linuxtp -I
/usr/local/tslib/include -L /usr/local/tslib/lib -prefix=/usr/local/Trolltech/QtEmbedded-4.7.3-arm

其中引數列表中的:

-I
/usr/local/tslib/include -L /usr/local/tslib/lib -prefix=/usr/local/Trolltech/QtEmbedded-4.7.3-arm

-I /usr/local/tslib/include  #指的是編譯要用到的tslib標頭檔案,tslib指的是本地Linux系統編譯之後的tslib;

-L /usr/local/tslib/lib #指的是編譯要用到的tslib的庫檔案

-prefix=/usr/local/Trolltech/QtEmbedded-4.7.3-arm #指的是編譯之後Qte的目錄

3:編譯完之後,會在/usr/local目錄下產生一個叫Trolltech/QtEmbedded-4.7.3-arm的資料夾,裡面就是嵌入式Qt的各種lib,編譯工具以及一些demos等等,這裡面我們往往最需要的就是bin檔案下的編譯工具鏈以及lib庫裡面的Qte庫,我們可以把Trolltech/QtEmbedded-4.7.3-arm/下面的這個lib目錄拷貝到開發板的根檔案系統的某個地方,比如放到/opt下面,我的是:/opt/QtEmbedded-4.7.3-arm/lib,當然,為了演示Qte的一些例子(QtEmbedded-4.7.3-arm/下面目錄有個demos目錄),我們可以把整個QtEmbedded-4.7.3-arm拷貝到開發板的根檔案系統某個地方,比如我的是:/opt/QtEmbedded-4.7.3-arm

4:配置Qte.在第三步最後,我們已經得到了Qte的lib庫,我們在嵌入式開發中使用的Qt程式之所以能夠執行,靠的就是Qte的lib庫支援,所以,我們要把Qte的庫加到Linux系統的類庫路徑變數上去,那就是:LD_LIBRARY_PATH,在這裡我們講下LD_LIBRARY_PATH作用.

LD_LIBRARY_PATH:Linux環境變數名,該環境變數主要用於指定查詢共享庫(動態連結庫)時除了預設路徑之外的其他路徑.(該路徑在預設路徑之前查詢)
移植程式時的經常碰到需要使用一些特定的動態庫,而這些編譯好的動態庫放在我們自己建立的目錄裡,這時可以將這些目錄設定到LD_LIBRARY_PATH中.

我們要做的就是把Qte的lib加到/etc/profile這個檔案裡面,以及再加上Qte的一些其他設定,我們開啟/etc/profile,加入如下配置:

#加入Qte的lib
 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/QtEmbedded-4.7.3-arm/lib
#Qpe路徑,Qpe是個模擬環境,我們要給Qpe模擬的目錄,也就是我們的Qte路徑,注意Qte跟Qpe是截然不同的
export set QPEDIR=/opt/QtEmbedded-4.7.3-arm/
#Qte字型庫路徑
export QT_QWS_FONTDIR=/opt/QtEmbedded-4.7.3-arm/lib/fonts

如果想讓QT/E在ARM端支援USB滑鼠,也可以在這個檔案裡配置,這些都取決與自己的系統以及硬體裝置,有些系統可能沒有這些裝置,那就暫時不用新增
export QWS_MOUSE_PROTO=MouseMan:/dev/input/mouse0export QWS_MOUSE_PROTO=”TPanel:/dev/touchpanel MouseMan:/dev/mice”

加好之後,可以看到我們移植tslib以及Qte之後,所修改的/etc/profile檔案合併起來之後是這樣的:

export TSLIB_ROOT=/opt/tslib
export TSLIB_TSDEVICE=/dev/event1
export TSLIB_CALIBFILE=$TSLIB_ROOT/etc/pointercal
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_CONSOLEDEVICE=none
export LD_LIBRARY_PATH=/opt/tslib/lib:/opt/QtEmbedded-4.7.3-arm/lib
export set QPEDIR=/opt/QtEmbedded-4.7.3-arm/
export QWS_MOUSE_PROTO=Tslib:/dev/event1
export QWS_DISPLAY="LinuxFb:mmWidth100:mmHeight130:0"
export QWS_SIZE=800x600
export QTDIR=/opt/QtEmbedded-4.7.3-arm/
export QT_QWS_FONTDIR=/opt/QtEmbedded-4.7.3-arm/lib/fonts

5:執行Qt程式

假如在第三步驟把整個/opt/QtEmbedded-4.7.3-arm目錄拷貝過來的,那麼我們可以在目錄QtEmbedded-4.7.3-arm/demos/mainwindow中執行自帶的一個視窗程式:
./mainwindow -qws

必須加上-qws命令,qws是執行嵌入式程式在嵌入式QT版本中,程式需要伺服器或自己作為伺服器程式

執行這條命令便可以看到一個窗口出來,那麼恭喜,到此Qte已經成功移植了.

假如在第三步沒有把整個/opt/QtEmbedded-4.7.3-arm目錄拷貝過來,而是想執行自己的程式的話,那麼我們便可以在Linux系統上,用編譯好的QtEmbedded-4.7.3-arm目錄裡面的bin資料夾裡面的工具,他們是:lrelease moc qmake rcc uic,我們常用的就是qmake了,通過qmake去編譯自己的專案,把編譯之後生成的可執行程式放到開發板的根檔案系統,比如編譯之後程式是testqte,那麼在開發板便可執行:./testqte -qws

這樣就可以把我們自己的程式跑起來了.到此,Qte移植結束.

移植過程可能出現的一些錯誤:

1:error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
解決辦法:把交叉編譯工具鏈下的libstdc++.so.6拷貝到Qte的lib目錄資料夾下,注意,有的交叉編譯鏈中庫libstdc++.so.6可能是個軟連線,所以,我們一定要把真正的檔案拷過去,千萬不能只拷貝一個連線過去了,還是會報錯的.比如我遇到錯誤,這麼解決:

cp libstdc++.so libstdc++.so.6 libstdc++.so.6.0.12 ~/minifs/opt/QtEmbedded-4.7.3-arm/lib/

2:error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory

解決辦法:如上,找lib拷貝即可