最近買了個飛凌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++需要先安裝:
- apt-get install g++
apt-get install g++
另外很多參考資料中安裝如下幾個依賴包:libX11-dev libXext-dev libXtst-dev,雖然不知道具體依賴關系,安裝上總不會錯。命令:
- 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)缺少鏈接庫:
/usr/local/tslib/lib/libts.a(ts_load_module.o): In function `__ts_load_module':ts_load_module.c:(.text+0x80): undefined reference to `dlopen'ts_load_module.c:(.text+0x90): undefined reference to `dlsym'ts_load_module.c:(.text+0xf0): undefined reference to `dlclose'ts_load_module.c:(.text+0x120): undefined reference to `dlclose'ts_load_module.c:(.text+0x158): undefined reference to `dlclose'make[1]:正在離開目錄 `/lsj_pro/qt-everywhere-opensource-src-4.8.6/src/gui'
解決方案:
修改./src/gui/Makefile
- ...
- 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
- ...
... 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庫,這個庫用於動態連接庫的操作:
- ...
- 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
- ...
... 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制作,輸入命令
- 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
然后:
libtool --tag=CC --mode=link arm-linux-g++ -g -O2 -o liblinux-atomic.la linux-atomic.lo
這一步會在當前目錄生成.libs目錄;
3.將生成的庫拷貝到一個比較短的目錄,比如/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了。
移植庫至開發板並設置環境變量
- /usr/local/tslib/etc/ts.conf拷貝至開發板/etc/,切換至/usr/local/tslib/lib/目錄,將除pkconfig目錄外的文件拷貝至開發板/lib/;
- 打包qt庫,我用了別人寫好的一個腳本mk_qt4_target,打包好在當前目錄生成壓縮包target-qte-4.8.6.tar.bz2,拷貝至開發板根目錄,解壓即可在/usr/local/下看到需要的qt庫文件;
- 環境變量腳本qt4_en.sh,內容如下:
- #!/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
#!/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
運行:
./helloword -qws效果如下,點擊觸摸屏有反應,鼠標箭頭可以移動



