大四那年,我曾研究過如何在PC機上交叉編譯出能在樹莓派運行的ARM匯編程序。現在,我突發奇想,是否也能在QT Creator上配置交叉編譯環境,以在嵌入式Linux上運行QT程序呢?本文將以全志V853晶元作為目標平台為例,詳細介紹如何在QT Creator上配置交叉編譯環境。對於其他目標平台,參數稍作修改即可。
**准備交叉編譯器環境**
首先,利用全志V853開發板提供的Tina SDK包中的交叉編譯器。假設Tina SDK包放置在當前用戶目錄下,目錄名為tina-v853-open,則交叉編譯器所在路徑為~/.tina-v853-open/bin。接下來,將交叉編譯器路徑、編譯器引用的庫文件路徑添加至環境變數。在~/.bashrc文件末尾,使用管理員許可權編輯,加入以下兩行代碼。然後執行命令刷新環境變數。
驗證交叉編譯器環境是否配置好,輸入特定命令,查看gcc版本,確保版本為8.3.0。
**編譯QT源碼**
編譯目標是生成在目標平台可用的QT庫以及相應的qmake。首先下載QT源碼,解壓至當前用戶目錄。接下來,修改qmake.conf文件,調整配置以適應目標平台。隨後,新建目錄存放編譯後的QT庫,配置編譯選項,指定編譯線程數,加快編譯速度。最後,開始編譯QT源碼,並驗證編譯結果。
**配置QT Creator**
QT Creator是用於QT程序開發的IDE。若未安裝,可通過相應途徑獲取。配置編譯器時,打開QT Creator,選擇「工具」->「選項」,在「編譯器」一欄中添加GCC和G++編譯器路徑,指定名稱。接著,配置交叉編譯用的QT版本,通過添加qmake路徑到「QT Versions」中。最後,配置Kits,設置編譯器和QT版本,驗證配置是否有效。
**驗證測試**
新建C語言工程測試配置的交叉編譯環境。在「項目」中設置環境變數,確保編譯成功。通過編譯後的文件指令集檢查,確認程序的指令集與目標平台兼容,完成對交叉編譯環境的驗證。
⑵ Linux下的交叉編譯環境設置
採用交叉編譯的主要原因在於,多數嵌入式目標系統不能提供足夠的資源供編譯過程使用,因而只好將編譯工程轉移到高性能的主機中進行。
linux下的交叉編譯環境重要包括以下幾個部分:
1.對目標系統的編譯器gcc
2.對目標系統的二進制工具binutils
3.目標系統的標准c庫glibc
4.目標系統的linux內核頭文件
交叉編譯環境的建立步驟
一、下載源代碼 下載包括binutils、gcc、glibc及linux內核的源代碼(需要注意的是,glibc和內核源代碼的版本必須與目標機上實際使用的版本保持一致),並設定shell變數PREFIX指定可執行程序的安裝路徑。
二、編譯binutils 首先運行configure文件,並使用--prefix=$PREFIX參數指定安裝路徑,使用--target=arm-linux參數指定目標機類型,然後執行make install。
三、配置linux內核頭文件
首先執行make mrproper進行清理工作,然後執行make config ARCH=arm(或make menuconfig/xconfig ARCH=arm)進行配置(注意,一定要在命令行中使用ARCH=arm指定cpu架構,因為預設架構為主機的cpu架構),這一步需要根據目標機的實際情況進行詳細的配置,筆者進行的實驗中目標機為HP的ipaq-hp3630 PDA,因而設置system type為SA11X0,SA11X0 Implementations中選擇Compaq iPAQ H3600/H3700。
配置完成之後,需要將內核頭文件拷貝到安裝目錄: cp -dR include/asm-arm $PREFIX/arm-linux/include/asm cp -dR include/linux $PREFIX/arm-linux/include/linux
四、第一次編譯gcc
首先運行configure文件,使用--prefix=$PREFIX參數指定安裝路徑,使用--target=arm-linux參數指定目標機類型,並使用--disable-threads、--disable-shared、--enable-languages=c參數,然後執行make install。這一步將生成一個最簡的gcc。由於編譯整個gcc是需要目標機的glibc庫的,它現在還不存在,因此需要首先生成一個最簡的gcc,它只需要具備編譯目標機glibc庫的能力即可。
五、交叉編譯glibc
這一步驟生成的代碼是針對目標機cpu的,因此它屬於一個交叉編譯過程。該過程要用到linux內核頭文件,默認路徑為$PREFIX/arm-linux/sys-linux,因而需要在$PREFIX/arm-linux中建立一個名為sys-linux的軟連接,使其內核頭文件所在的include目錄;或者,也可以在接下來要執行的configure命令中使用--with-headers參數指定linux內核頭文件的實際路徑。
configure的運行參數設置如下(因為是交叉編譯,所以要將編譯器變數CC設為arm-linux-gcc): CC=arm-linux-gcc ./configure --prefix=$PREFIX/arm-linux --host=arm-linux --enable-add-ons 最後,按以上配置執行configure和make install,glibc的交叉編譯過程就算完成了,這里需要指出的是,glibc的安裝路徑設置為$PREFIXARCH=arm/arm-linux,如果此處設置不當,第二次編譯gcc時可能找不到glibc的頭文件和庫。
六、第二次編譯gcc
運行configure,參數設置為--prefix=$PREFIX --target=arm-linux --enable-languages=c,c++。
運行make install。
到此為止整個交叉編譯環境就完全生成了。
幾點注意事項
第一點、在第一次編譯gcc的時候可能會出現找不到stdio.h的錯誤,解決辦法是修改gcc/config/arm/t-linux文件,在TARGET_LIBGCC2_CFLAGS變數的設定中增加-Dinhibit_libc和-D__gthr_posix_h。
⑶ Linux-Arm環境下配置編譯qt-everywhere及交叉編譯環境
在進行Linux-Arm環境下配置編譯qt-everywhere及交叉編譯環境的過程中,首先需要明確的是,Qt並未直接提供針對Arm平台的版本,故需要通過qt-everywhere套件在Arm系統上自行編譯。在此過程中,我們需特別注意Qt-everywhere在Arm環境下編譯可能遇到的問題,例如嘗試直接使用./configure -prefix xxx來編譯時,可能會出現「libqtharfbuzz.a:No such file or directory」的報錯,導致編譯失敗。
因此,在Arm板上進行編譯前的准備時,需對某些模塊進行取捨,即在./configure階段將其標注為不需要。接下來,我們將具體流程詳細展開。
1. 下載並解壓qt-everywhere包至指定文件夾,例如使用download.qt.io下載並解壓qt-everywhere-src-5.12.10.tar.xz至工作目錄。
2. 進入qt-everywhere-src-5.12.10目錄,使用./configure -prefix ~/qtInstall來配置並指定編譯後的Qt安裝目錄。具體安裝目錄可以根據需要自行調整。
3. 若./configure過程無誤,將提示可以使用make install進行編譯和安裝。然而,編譯過程中可能會遇到如「數字有關的函數未被定義」的錯誤,例如在qendian.h中。解決此問題,需手動添加相應的頭文件,如在文件中添加#include \ 來解決。
4. 在完成make install後,可能還會遇到其他依賴庫缺失的錯誤,如libharfbuzz或python庫。解決這類問題,可以通過在Linux系統中使用sudo apt-get install libharfbuzz-dev安裝libharfbuzz庫,或使用sudo apt-get install python安裝Python庫,然後刪除build後的相關文件,重新編譯Qt。
通過以上步驟,我們能夠在Arm環境下成功配置並編譯qt-everywhere,為後續的交叉編譯環境搭建奠定基礎。