Qt4.8.6 Embedded Linux 的編譯與移植


 

        最近買了個飛凌ok6410 的開發板,於是在其中搭建qt4.8.6運行環境。費了兩三天時間,主要還是對Linux系統的生疏,在一些問題上徘徊很久,在這里做一些過程筆記。燒寫ARM-Linux系統,根據飛凌官方的用戶手冊成功為開發板燒寫了U-boot、kernel3.0.1、以及rootfs.yaffs(均由飛凌官方提供)。

編譯環境:

PC:Ubuntu12.04 LTS,Vmware Workstation 10.0.5 build-2443746

Qt:4.8.6 qt-everywhere-opensource-src-4.8.6.tar.gz

tslib:未使用開發板提供的tslib1.4

交叉編譯器:arm-linux-gcc-4.3.2

 

編譯准備:

1.依賴包安裝

純凈版的Ubuntu沒有g++需要先安裝:

 

  1. apt-get install g++  
apt-get install g++

 

另外很多參考資料中安裝如下幾個依賴包:libX11-dev libXext-dev libXtst-dev,雖然不知道具體依賴關系,安裝上總不會錯。命令:

 

  1. apt-get install libX11-dev libXext-dev libXtst-dev  
apt-get install libX11-dev libXext-dev libXtst-dev

 

 

2.交叉編譯器:

 

        最開始采用arm-linux-gcc-4.4.3版本交叉編譯qt4.8.6的過程十分順利,但將庫移植到ok6410開發板后,運行使用qt4.8.6編譯的程序,報錯:GLIBC2.9 not found,經過多番查實,主要問題在於飛凌官方提供的文件系統所使用的glibc(2.8)與Ubuntu12.04的glibc(2.15)的版本不匹配,於是試圖去升級開發板glibc版本,但水平有限無果(如果沒有把握自己定制內核、文件系統,而且時間緊迫的情況下,不建議去折騰,學習目的除外)。最后交叉編譯器使用的是4.3.2版本

3.關於tslib版本的幾點說明:

        最開始使用的是開發板提供的tslib1.4,tslib的交叉編譯安裝過程十分簡單。但在移植qt庫和環境變量后,運行交叉編譯的qt程序,arm開發板顯示屏可以呈現程序界面,說明qt庫移植基本OK,但觸摸屏無法移動,並且超級終端顯示錯誤 "Couldnt load module pthres QWSTslibMouseHandlerPrivate: ts_config() failed with error: 'No such file or directory' Please check your tslib installation!",網上一些資料提到可能是開發板提供的tslib版本太舊了,抱着試一試的心態,下載了最新的tslib,最后就沒出現上述問題,也說明了我的環境變量設置的正確性。

 

 

這樣獲得的tslib源代碼是最新的,目前是穩定版本。 

Tslib和Qt在開發板上的移植

主要參考博客:

http://www.cnblogs.com/Jasonsblog/p/3757985.html或者http://www.cnblogs.com/emouse/archive/2013/01/29/2881311.html

另外風間一葉的《linux arm Qt 移植配置 一鍵推送遠程調試 視頻教程 》;

qt4.8.6編譯過程中遇到的問題:

1)缺少鏈接庫:

  1. /usr/local/tslib/lib/libts.a(ts_load_module.o): In function `__ts_load_module':  
/usr/local/tslib/lib/libts.a(ts_load_module.o): In function `__ts_load_module':
  1. ts_load_module.c:(.text+0x80): undefined reference to `dlopen'  
ts_load_module.c:(.text+0x80): undefined reference to `dlopen'
  1. ts_load_module.c:(.text+0x90): undefined reference to `dlsym'  
ts_load_module.c:(.text+0x90): undefined reference to `dlsym'
  1. ts_load_module.c:(.text+0xf0): undefined reference to `dlclose'  
ts_load_module.c:(.text+0xf0): undefined reference to `dlclose'
  1. ts_load_module.c:(.text+0x120): undefined reference to `dlclose'  
ts_load_module.c:(.text+0x120): undefined reference to `dlclose'
  1. ts_load_module.c:(.text+0x158): undefined reference to `dlclose'  
ts_load_module.c:(.text+0x158): undefined reference to `dlclose'
  1. collect2: ld returned 1 exit status  
collect2: ld returned 1 exit status
  1. make[1]: *** [../../lib/libQtGui.so.4.8.6] 錯誤 1  
make[1]: *** [../../lib/libQtGui.so.4.8.6] 錯誤 1
  1. make[1]:正在離開目錄 `/lsj_pro/qt-everywhere-opensource-src-4.8.6/src/gui'  
make[1]:正在離開目錄 `/lsj_pro/qt-everywhere-opensource-src-4.8.6/src/gui'
  1. make: *** [sub-gui-make_default-ordered] 錯誤 2  
make: *** [sub-gui-make_default-ordered] 錯誤 2

     解決方案:

修改./src/gui/Makefile

  1. ...  
  2. LIBS          = $(SUBLIBS)  -L/usr/local/tslib-1.4/lib -L/home/work/qt/qt-4.7.0-arm/lib -lQtNetwork -L/usr/local/tslib-1.4/lib -L/home/work/qt/qt-4.7.0-arm/lib -lQtCore -lpthread -lts  
  3. ...  
...
LIBS          = $(SUBLIBS)  -L/usr/local/tslib-1.4/lib -L/home/work/qt/qt-4.7.0-arm/lib -lQtNetwork -L/usr/local/tslib-1.4/lib -L/home/work/qt/qt-4.7.0-arm/lib -lQtCore -lpthread -lts
...

 

在末尾添加庫libdl庫,這個庫用於動態連接庫的操作:
  1. ...  
  2. LIBS          = $(SUBLIBS)  -L/usr/local/tslib-1.4/lib -L/home/work/qt/qt-4.7.0-arm/lib -lQtNetwork -L/usr/local/tslib-1.4/lib -L/home/work/qt/qt-4.7.0-arm/lib -lQtCore -lpthread -lts -ldl  
  3. ...  
...
LIBS          = $(SUBLIBS)  -L/usr/local/tslib-1.4/lib -L/home/work/qt/qt-4.7.0-arm/lib -lQtNetwork -L/usr/local/tslib-1.4/lib -L/home/work/qt/qt-4.7.0-arm/lib -lQtCore -lpthread -lts -ldl
...

 

保存后退出,切換至源碼目錄下繼續make -j4。

2)undefined reference to `__sync_sub_and_fetch_4':

造成這個原因主要是gcc版本問題。

          解決方案(http://blog.csdn.net/zpzkitt/article/details/8970626):

1.下載gcc源碼:我后來使用的4.4.3的(系統自帶的gcc-4.6.3的貌似用不成),解壓,在gcc-4.4.3/gcc/config/arm/目錄下找到一個linux-     atomic.c;

2.制作鏈接庫:使用libtool制作,輸入命令 

 

  1. libtool --tag=CC --mode=compile arm-linux-gcc -g -O2 -MT linux-atomic.lo -MD -MP -MF linux-atomic.Tpo -c -o linux-atomic.lo linux-atomic.c   
libtool --tag=CC --mode=compile arm-linux-gcc -g -O2 -MT linux-atomic.lo -MD -MP -MF linux-atomic.Tpo -c -o linux-atomic.lo linux-atomic.c 

 

然后:

 

  1. libtool --tag=CC --mode=link arm-linux-g++ -g -O2 -o liblinux-atomic.la linux-atomic.lo  
 libtool --tag=CC --mode=link arm-linux-g++ -g -O2 -o liblinux-atomic.la linux-atomic.lo

 

這一步會在當前目錄生成.libs目錄;

3.將生成的庫拷貝到一個比較短的目錄,比如/opt:

 

  1. cp .libs/liblinux-atomic.a /opt  
cp .libs/liblinux-atomic.a /opt

 

4.修改Qt的Makefile:

進入Qt源碼目錄:

cd qt-everywhere-opensource-src-4.8.6

然后:vim src/script/Makefile

修改:在LIBS  = 。。。。。。。。。。。。。的結尾添加-L/opt  -llinux-atomic

          保存,繼續make -j4,最后執行make install就OK了。

移植庫至開發板並設置環境變量

 

  1. /usr/local/tslib/etc/ts.conf拷貝至開發板/etc/,切換至/usr/local/tslib/lib/目錄,將除pkconfig目錄外的文件拷貝至開發板/lib/;
  2. 打包qt庫,我用了別人寫好的一個腳本mk_qt4_target,打包好在當前目錄生成壓縮包target-qte-4.8.6.tar.bz2,拷貝至開發板根目錄,解壓即可在/usr/local/下看到需要的qt庫文件;
  3. 環境變量腳本qt4_en.sh,內容如下:

 

  1. #!/bin/sh  
  2. if [ -c /dev/input/event2 ]; then  
  3. INPUT_PATH=/dev/input  
  4. else  
  5.      INPUT_PATH=/dev  
  6. fi  
  7. export TSLIB_TSDEVICE=/dev/input/event2  
  8. export TSLIB_CONFFILE=/etc/ts.conf  
  9. export TSLIB_PLUGINDIR=/lib/ts  
  10. export TSLIB_CALIBFILE=/etc/pointercal  
  11. export QTDIR=/usr/local/Trolltech/QtEmbedded-4.8.6-arm/  
  12. export PATH=$QTDIR/bin:$PATH  
  13. export LD_LIBRARY_PATH=$QTDIR/lib  
  14. export QWS_MOUSE_PROTO="Tslib:$INPUT_PATH/event2"  
  15. #export QWS_MOUSE_PROTO="Tslib:$INPUT_PATH/event2 MouseMan:$INPUT_PATH/mouse1"  
  16. export QWS_KEYBOARD=TTY:/dev/tty1  
  17. #sync font size with QtDesigner   
  18. export QWS_DISPLAY="LinuxFB:mmWidth200:0"  
  19. export QWS_SIZE="480x272"  
  20. export KDEDIR=/opt/kde  
  21. export HOME=/root  
#!/bin/sh
if [ -c /dev/input/event2 ]; then
INPUT_PATH=/dev/input
else
     INPUT_PATH=/dev
fi
export TSLIB_TSDEVICE=/dev/input/event2
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/lib/ts
export TSLIB_CALIBFILE=/etc/pointercal
export QTDIR=/usr/local/Trolltech/QtEmbedded-4.8.6-arm/
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib
export QWS_MOUSE_PROTO="Tslib:$INPUT_PATH/event2"
#export QWS_MOUSE_PROTO="Tslib:$INPUT_PATH/event2 MouseMan:$INPUT_PATH/mouse1"
export QWS_KEYBOARD=TTY:/dev/tty1
#sync font size with QtDesigner 
export QWS_DISPLAY="LinuxFB:mmWidth200:0"
export QWS_SIZE="480x272"
export KDEDIR=/opt/kde
export HOME=/root

 

以上是我的開發板配置,具體的設置還需要根據開發板硬件做相應的修改。

運行測試:

在QtCreator3.3.0中設計簡單UI,並編譯拷貝至開發板運行,應用程序名:helloworld 

運行:

  1. ./helloword -qws  
    ./helloword -qws
效果如下,點擊觸摸屏有反應,鼠標箭頭可以移動

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM