QT環境搭建: QT玩轉在linux的x86平臺或者ARM平臺上
參考連結:
tslib1.4與Qt4.8.6的交叉編譯與移植
Tslib和Qt 4.8.4與在開發板上的移植
目的:使自己在Ubuntu下的qtcreator3.5.0生成的介面,通過qt4.8.6交叉編譯,gcc4.4.3交叉編譯,得到一個可執行qt程式,並將其放到開發板下,執行;
tslib編譯與安裝
觸控式螢幕軟體 tslib1.4.tar.gz tslib是觸控式螢幕校準的庫,這個是tslib原始碼,可以移植到嵌入式裝置中對觸控式螢幕進行校準在採用觸控式螢幕的移動終端中,觸控式螢幕效能的除錯是個重要問題之一,因為電磁噪聲的緣故,觸控式螢幕容易存在點選不準確、有抖動等問題。
Tslib是一個開源的程式,能夠為觸控式螢幕驅動獲得的取樣提供諸如濾波、去抖、校準等功能,通常作為觸控式螢幕驅動的適配層,為上層的應用提供了一個統一的介面。在
1.解壓縮:tar -zxvf tslib1.4.tar.gz
2.執行./autogen.sh
./autogen.sh: 4: autoreconf: not found
是在不同版本的 tslib下執行autogen.sh產生。它們產生的原因一樣,是因為沒有安裝
automake 工具, (ubuntu 8.04)用下面的命令安裝好就可以了。
sudo apt-get install autoconf automake libtool
3.執行
./configure --host=arm-linux --prefix=/opt/tslib-1.4 ac_cv_func_malloc_0_nonnull=yes
4.make
在make時出錯,提示In function ‘open’,inlined from ‘main’ at ts_calibrate.c:229:11:/usr/include/bits/fcntl2.h:51:24: error: call to ‘__open_missing_mode’ declared with attribute error: open with O_CREAT in second argument needs 3 arguments
解決方法:
這是因為open函式的語法不符合最新的gcc,在/tests/ts_calibrate.c中加入open的第三個引數0777:
if ((calfile = getenv("TSLIB_CALIBFILE")) != NULL) {cal_fd = open (calfile, O_CREAT | O_RDWR, 0777);} else {cal_fd = open ("/etc/pointercal", O_CREAT | O_RDWR, 0777);
}
5.make install
編譯安裝成功如下圖:
tslib的開發板移植與測試
將交叉編譯的tslib安裝到開發板上其實就是拷貝相關的檔案並新增系統環境變數而已,所以相對操作較為簡單,主要的就是需要找對目錄就行。
按照上面的操作方法,交叉編譯安裝後的檔案在/usr/local/tslib目錄下,因此需要拷貝的檔案如下:
1./usr/local/tslib/lib檔案下除去pkgconfig目錄外其他所有檔案拷貝到開發板/lib目錄下
2./usr/local/tslib/etc下的ts.conf拷貝到開發板的/etc下,在複製對應目錄之前修改檔案如下,也可以複製完成後修改。
下面是ts.conf檔案的第一行與第二行
# Uncomment if you wish to use the linux input layer event interface
# module_raw input
去掉# module_raw input前面的註釋,一定要注意中間的空格也去掉,module頂格。
最後新增環境變數,通過超級終端在開發板系統中新增環境變數,可以在開發板檔案系統的/etc/profile檔案裡新增,也可以直接新增。
export TSLIB_TSDEVICE=/dev/input/touchscreen0
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/lib/ts
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
說明:
TSLIB_TSDEVICE //觸控式螢幕裝置檔名。
TSLIB_CALIBFILE //校準的資料檔案,由ts_calibrate校準程式生成。
SLIB_CONFFILE //配置檔名。
TSLIB_PLUGINDIR //外掛目錄
TSLIB_CONSOLEDEVICE //控制檯裝置檔名
TSLIB_FBDEVICE //裝置名
以上環境變數在實際開發中的實際配置可以根據實際情況決定。而這些指定的裝置節點一定要和你的開發板上的/dev目錄下的裝置節點相對應。
最後執行測驗程式
ts_calibrate 進行校驗
ts_test 進行測試
測試結果如下圖所示:
說明:這裡用的交叉編譯工具鏈是網上下載的arm-linux-gcc (version4.3.2)版本;
QT 的交叉編譯與安裝
軟體平臺
Linux:Ubuntu 15.04(32位,儘量用32位的,不然還得安裝32位的庫檔案。)
qt-library:4.8.6
qt-creator:3.5.0
Linux version: 3.19
交叉編譯工具鏈:arm-linux-gcc (version 4.3.2)
開發板版本:
AT91 SAM9G45:Linux version 3.6.9 + gcc version 4.2.2
和PC平臺下的編譯類似,通過執行./configure進行配置生成makefile檔案,然後編譯安裝,只是因為是針對嵌入式平臺需要進行一些針對性配置,這裡生成一個自動配置檔案,可以通過修改檔案來方便的更改配置。
1.下載QT4.8.6,
qt-everywhere-opensource-src-4.8.6 .tar.gz
2.進入:/etc/profile,確保現在的編譯工具是g++;
3.# cd qt-everywhere-opensource-src-4.8.6
#sudo gedit autoconfig.sh
加入以下內容儲存.
#!/bin/sh
./configure \
-opensource \
-confirm-license \
-release -shared \
-embedded arm \
-xplatform qws/linux-arm-g++ \
-depths 16,18,24,32 \
-fast \
-optimized-qmake \
-pch \
-qt-sql-sqlite \
-qt-libjpeg \
-qt-zlib \
-qt-libpng \
-qt-freetype \
-little-endian -host-little-endian \
-no-qt3support \
-no-libtiff -no-libmng \
-no-opengl \
-no-mmx -no-sse -no-sse2 \
-no-3dnow \
-no-openssl \
-no-webkit \
-no-qvfb \
-no-phonon \
-no-nis \
-no-opengl \
-no-cups \
-no-glib \
-no-xcursor -no-xfixes -no-xrandr -no-xrender \
-no-separate-debug-info \
-nomake examples -nomake tools -nomake docs \
-qt-mouse-tslib \
-I/usr/local/tslib/include \
-L/usr/local/tslib/lib
exit
-embedded arm: 表示將編譯針對 arm平臺的embedded版本;
-xplatform qws/linux-arm-g++: 表示使用 arm-linux交叉編譯器進行編譯;
-qt-mouse-tslib: 表示將使用 tslib來驅動觸控式螢幕;
執行指令碼
#sudo chmod +x autoconfig.sh
#./autoconfig.sh
如果在configure時出錯,提示
You mightneed to modify the include and library search paths by editingQMAKE_INCDIR and QMAKE_LIBDIR in/home/Raymond/qt-embedded-arm-tslib/mkspecs/qws/linux-arm-g++.
解決辦法:
是arm-linux-gcc的路徑沒有新增到系統變數中
解決辦法:
a.是arm-linux-gcc的路徑沒有新增到系統變數中:/etc/profile
b.往最後兩行加了QMAKE的目錄和庫路徑:
c.如果編譯出現缺少連結資訊錯誤:
warning: libts-0.0.so.0, needed by , not found (try using -rpath or -rpath-link)
undefined reference to `ts_read_raw'
undefined reference to `ts_open'
undefined reference to `ts_fd'
undefined reference to `ts_config'
undefined reference to `ts_close'
undefined reference to `ts_read'
collect2: ld returned 1 exit status
解決方法如下:
修改qt-everywhere-opensource-src-4.8.6/mkspecs/qws/linux-arm-g++/qmake.conf 檔案(新增lts引數):
QMAKE_CC = arm-linux-gcc -lts
QMAKE_CXX = arm-linux-g++ -lts
QMAKE_LINK = arm-linux-g++ -lts
QMAKE_LINK_SHLIB = arm-linux-g++ -lts
2. make
如果出現如下錯誤:
cc1:error:.pch/release-shared-emb-arm/QtGui:NO such file or directory
在配置時新增引數: -no-pch
如果出現如下錯誤:
make[1]: 正在進入目錄 `/home/duliqun/qt-everywhere-opensource-src-4.8.6/src/corelib'g++ -c -include .pch/release-shared-emb-arm/QtCore -pipe -I/opt/tslib-1.0/include -fno-exceptions -O2 -fvisibility=hidden -fvisibility-inlines-hidden -Wall -W -D_REENTRANT -fPIC -DQT_SHARED -DQT_QLOCALE_USES_FCVT -DQT_BUILD_CORE_LIB -DQT_NO_USING_NAMESPACE -DQT_NO_CAST_TO_ASCII -DQT_ASCII_CAST_WARNINGS -DQT3_SUPPORT -DQT_MOC_COMPAT -DQT_USE_QSTRINGBUILDER -DELF_INTERPRETER=\"\" -DHB_EXPORT=Q_CORE_EXPORT -DQT_NO_DEBUG -I../../mkspecs/linux-g++ -I. -I../../include -I../../include/QtCore -I.rcc/release-shared-emb-arm -Iglobal -I../3rdparty/zlib -I../3rdparty/harfbuzz/src -I../3rdparty/md5 -I../3rdparty/md4 -I.moc/release-shared-emb-arm -o .obj/release-shared-emb-arm/qabstractanimation.o animation/qabstractanimation.cpp../../include/QtCore/../../src/corelib/arch/qatomic_armv5.h: Assembler messages:../../include/QtCore/../../src/corelib/arch/qatomic_armv5.h:131: Error: no such instruction: `swpb %cl,%dl,[%ebp]'../../include/QtCore/../../src/corelib/arch/qatomic_armv5.h:131: Error: no suchinstruction: `swpb %dl,%sil,[%ebp]'
可能是arm 交叉環境有問題,如果配置好了一般reconfigure下就ok.如果總是有問題,可以修改qatomic_armv5.h,將彙編用c code寫可以避過這個錯誤。
vi /home/duliqun/qt-everywhere-opensource-src-4.8.6/src/corelib/arch/qatomic_armv5.h
inline char q_atomic_swp(volatile char *ptr, char newval){register char ret;/*asm volatile("swpb %0,%2,[%3]": "=&r"(ret), "=m" (*ptr): "r"(newval), "r"(ptr): "cc", "memory");*/ret=*ptr;*ptr=newval;return ret;}
如果出現如下錯誤:
In file included from ssl/qsslsocket_openssl_symbols_p.h:57:0, from ssl/qsslcertificate.cpp:110:ssl/qsslsocket_openssl_p.h:66:26: 致命錯誤: openssl/asn1.h:沒有那個檔案或目錄編譯中斷。make[1]: *** [.obj/release-shared-emb-arm/qsslcertificate.o] 錯誤 1make[1]:正在離開目錄 `/home/duliqun/qt-everywhere-opensource-src-4.8.6/src/network'make: *** [sub-network-make_default] 錯誤 2
請執行:
sudo apt-get install openssl sudo apt-get install libssl-dev
3.make install 編譯安裝成功。
在:/usr/local目錄下就能看見安裝好的QT庫目錄!
移植到開發板
將編譯的資料夾,PC中的/usr/local/Trolltech/Qt-4.8.6/,拷到開發板的/usr/local/目錄下,我是用SD卡拷的。
程式中顯示中文字型等設定可以參見 Qt中顯示中文 這篇部落格。
(http://www.cnblogs.com/emouse/archive/2013/05/03/3056431.html)
設定環境變數:
我直接修改profile檔案
#vi /etc/profile
在最後加入以下內容
export set QTDIR=/usr/local/Qt-4.8.6 #目錄名要與拷貝的Qt資料夾名一致
export set LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
export set PATH=$QTDIR/bin:$PATH
export set MANPATH=$QTDIR/man:$MANPATH
export set QT_QWS_FONTDIR=/usr/local/Qt-4.8.6/lib/fonts
export set QWS_MOUSE_PROTO=tslib:/dev/event3 #重要
立即使用變數
#source /etc/profile
到此為止,QT的移植算是成功了
可以用Qt自帶的示例程式來測試一下,
# cd /usr/local/Qt-4.8.6/demos/
此資料夾下有很多示例程式,隨便選一個執行。
例如
cd affine/
./affine -qws
必須要加引數-qws