交叉編譯安裝ARM平臺上的Qt
一、宿主機環境搭建:
編譯需要x11庫的支援,在Ubuntu下安裝命令:
sudo apt-get install libx11-dev libxext-dev libxtst-dev
二、下載原始碼包:qt-everywhere-opensource-src-4.7.0.tar.gz
三、解壓原始碼包,檢視Qt原始碼中是否有適合我們編譯平臺的配置檔案,進入到原始碼目錄下的qws目錄下。ls 看一下,有一個適合我們的配置,就是linux-arm-gnueabi-g++ ,如果沒有,就自己建一個目錄,然後從別的目錄下拷貝這兩個檔案
qmake.conf
qplatformdefs.h
進入到linux-arm-gnueabi-g++目錄,看一下qmake.conf 的內容,如下:
QMAKE_CC = arm-none-linux-gnueabi-gcc
QMAKE_CXX = arm-none-linux-gnueabi-g++
QMAKE_LINK = arm-none-linux-gnueabi-g++
QMAKE_LINK_SHLIB = arm-none-linux-gnueabi-g++
# modifications to linux.conf
QMAKE_AR = arm-none-linux-gnueabi-ar cqs
QMAKE_OBJCOPY = arm-none-linux-gnueabi-objcopy
QMAKE_STRIP = arm-none-linux-gnueabi-strip
正確,我們就使用這個配置,如果不正確,可以改成自己的編譯器的名字。
四、配置:
可以執行./configure --help 檢視配置幫助
配置命令:
./configure -opensource -embedded arm -xplatform qws/linux-arm-g++ -qt-libtiff -qt-libmng -no-mouse-tslib -qt-mouse-pc -no-mouse-linuxtp -qt-mouse-linuxinput -no-neon -qt-libjpeg -qt-libpng
可以將配置編寫進指令碼檔案。
五、執行make –j4
-j引數指定編譯時的執行緒數,make –j不限制執行緒數。
六、執行make install。
預設安裝路徑為:/usr/local/Trolltech/QtEmbedded-4.7.0-arm
七、配置環境變數(vim /etc/profile):
#!/bin/sh
export QTDIR=/usr/local/Trolltech/QtEmbedded-4.7.0-arm
export QMAKEDIR=$QTDIR/qmake
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
export PATH=$QMAKEDIR/bin:$QTDIR/bin:/opt/arm-linux-gcc/bin:$PATH
export QMAKESPEC=qws/linux-arm-g++
使環境變數有效的方法:1、登出,重新登入。2、source /etc/profile(只在本次終端中有效)
測試搭建環境:qmake –v
QMake version 2.01a
Using Qt version 4.7.0 in /usr/local/Trolltech/QtEmbedded-4.7.0-arm/lib
出現上述文字則編譯成功。
八、交叉編譯。
編寫Hello World程式,儲存為hello.cpp。
#include <QApplication>
#include <QLabel>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QLabel *label = new QLabel("Hello Qt!");
label->show();
return app.exec();
}
執行如下命令:
1、 qmake –project(生成工程檔案)
2、 qmake (生成Makefile)
3、 make (編譯工程)
QT編譯出現fatal error: QApplication: No such file or directory
因為Qt5裡不再用QtGui模組,而是使用QtWidgets模組, 所以在.pro里加上 在hello.pro檔案中新增 QT += core gui widgets
九、開發板環境搭建及測試執行
1、在開發板上新建目錄/usr/local/Trolltech/QtEmbedded-4.7.0-arm,再把Ubuntu相同目錄下的lib和plugins資料夾拷貝到該目錄下。
2、將libstdc++.so.6.0.9 和libz.so.1.2.3(這兩個檔案在交叉編譯器的lib目錄中) 傳送到開發板的 /usr/local/lib 目錄下。(在這個步驟中,有的資料拷貝librt,具體操作命令如:#cp /usr/local/arm/4.5.1/arm-none-linux-gnueabi/libc/lib/librt-2.11.1.so /root/rootfs/lib
#cd /root/rootfs/lib
#chmod 777 librt-2.11.1.so
#ln -s librt-2.11.1.so librt.so.1)
3、設定開發板環境變數:
export LD_LIBRARY_PATH=/usr/local/Trolltech/QtEmbedded-4.7.0-arm/lib:/usr/local/lib
4、測試執行:第八步中生成的檔案下載到開發板中,執行命令:./hello –qws測試程式。
附:開發板環境詳細配置:
export QWS_DISPLAY=:1
export QTDIR=/usr/local/Trolltech/QtEmbedded-4.7.0-arm
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
export QWS_MOUSE_PROTO="LinuxInput:/dev/touchscreen"
export QT_QWS_FONFDIR=$QTDIR/lib/fonts/
export QT_PLUGIN_PATH=$QTDIR/plugins
遇到問題總結:
1、 開發板上的程式不能顯示中文漢字,可能是環境變數沒有設定QT_QWS_FONFDIR(猜測,沒有測試)。
2、 在編譯有資料庫的程式時出錯,說沒有發現QsqlDatabase之類的,在生成的*.pro檔案中加入QT += sql編譯通過了。之前,還懷疑是在配置編譯Qt時沒有新增sql功能,還在配置中加入了-qt-sql-sqlite語句重新編譯了Qt。。。