交叉編譯ARM版Qt(qt-everywhere-opensource-src-4.8.4)
交叉編譯ARM版 Qt (qt-everywhere-opensource-src-4.8.4)
因實際專案需求,需將Qt編譯成LINUX-ARM版,以下為整個操作過程,使用Qt編寫的程式已在實際開發板上執行,在此貼出,但願能為需要的朋友提供上幫助。
準備工作:
Linux核心版本:
開發電腦:Ubuntu12.04,開發板:linux-2.6.37
交叉編譯工具:
arm-none-linux-gnueabi 4.4.1
Qt安裝包:
qt-everywhere-opensource-src-4.8.4.tar.gz
安裝
一.安裝交叉編譯工具
1.本機使用的交叉編譯工具是:arm-none-linux-gnueabi
2.新增交叉編譯工具的路徑至相應環境變數中:
export PATH=/usr/local/arm-2009q1-203/bin/:$PATH
3.通過以下命令檢視arm-none-linux-gnueabi編譯工具是否安裝成功
a. 執行:arm-none-linux-gnueabi-g++ -v
b. 執行:arm-none-linux-gnueabi-gcc -v
如果以上兩步都能正確列印對應的版本資訊,則表明arm-none-linux-gnueabi編譯工具
已安裝成功!
二.交叉編譯ARM版Qt
1.下載Qt原始碼包 qt-everywhere-opensource-src-4.8.4.tar.gz;
2.解壓Qt原始碼包
tar -xvfz qt-everywhere-opensource-src-4.8.4.tar.gz
3.修改檔案:
/usr/local/Qt-4.8.4-linux-arm/mkspecs/qws/linux-arm-g++/qmake.conf
# 設定交叉編譯工具鏈:
# 本專案使用的交叉編譯工具是 arm-none-linux-gnueabi-g++
#
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++
QMAKE_AR = arm-none-linux-gnueabi-ar cqs
QMAKE_OBJCOPY = arm-none-linux-gnueabi-objcopy
QMAKE_STRIP = arm-none-linux-gnueabi-strip
4.(如有需要,需修改g++.conf檔案)
修改檔案: /usr/local/Qt-4.8.4-linux-arm/mkspecs/common/g++.conf
# 設定使用ARM高階特性的編譯標誌:
#
QMAKE_CFLAGS_RELEASE += -O2 -march=armv7-a -mtune=cortex-a8 -mfloat-abi=softfp
5.配置Qt編譯選項
進入Qt解壓目錄,執行如下命令:
./configure -prefix /usr/local/Qt-4.8.4 -embedded arm -xplatform /qws/linux-arm-g++ -depths 16,24,32 -little-endian -no-mmx -no-3dnow -no-sse -no-sse2 -no-glib -no-cups -no-largefile -no-accessibility -no-openssl -no-gtkstyle -qt-freetype -qt-mouse-pc -qt-mouse-linuxtp -qt-mouse-linuxinput -plugin-mouse-pc -fast -qt-gfx-transformed -opensource -confirm-license
或者寫一個指令碼config.sh,內容如上,之後執行這個指令碼:./config.sh
6.執行 make 命令;
該步驟大致需要2~3個小時
錯誤:qtconcurrentiteratekernel.cpp:(.text+0x3c): undefined reference to `clock_gettime'
修改:vim src/corelib/Makefile 加上-lrt
LIBS = $(SUBLIBS) -L/opt/qt-everywhere-opensource-src-4.8.4/lib -lpthread -lm -ldl -lrt
7.執行 make install 命令;
8.修改使用者環境變數
export ARMQTDIR=/usr/local/Qt-4.8.4
export PATH=$ARMQTDIR/bin:$PATH
export MANPATH=$ARMQTDIR/man:$MANPATH
export LD_LIBRARY_PATH=$ARMQTDIR/lib:$LD_LIBRARY_PATH
9.測試 ARM 版 QT 是否安裝並配置成功:
a. 執行:qmake -v
列印以下對應資訊:
QMake version 2.01a
Using Qt version 4.8.4 in /usr/local/Qt-4.8.4/lib
b. 執行:which qmake
列印以下對應資訊:
/usr/local/Qt-4.8.4/bin/qmake
c. 編寫一個簡單的測試程式,檔名為hello.cpp,進入該檔案目錄,進行工程編譯,看是否能正確通編譯
hello.cpp原始碼:
#include <QApplication>
#include <QDebug>
int main(int argc,char *argv[])
{
qDebug("Hello, welcome to Qt world!");
return 0;
}
順序執行以下操作:
@1. 執行:qmake -project hello1.cpp
生成 hello1.pro 工程檔案
@2. 執行:qmake hello1.pro
生成 Makefile 檔案
@3. 執行:make
生成 hello.o, hello 檔案
如果執行@2步驟時出現以下錯誤:
QMAKESPEC has not been set, so configuration cannot be deduced.
Error processing project file: hello1.pro
則是 QMAKESPEC 變數沒有設定好,執行:
export QMAKESPEC=/usr/local/qt-4.8.4/mkspecs/qws/linux-arm-g++
cd /usr/local/Qt-4.8.4/lib/
file libQT* 看輸出資訊是ELF ARM
之後將/usr/local/Qt-4.8.4/lib/libQt* 根檔案系統/usr/lib/下