寫在前面
苦辣酸甜時光八載,春夏秋冬志此一生
Qt簡介:
Qt(官方發(fā)音 [kju:t],音同 cute)是一個跨平臺的 C++ 開發(fā)庫,主要用來開發(fā)圖形用戶界面(Graphical User Interface,GUI)程序,當然也可以開發(fā)不帶界面的命令行(Command User Interface,CUI)程序。
Qt 支持的操作系統(tǒng)有很多,例如通用操作系統(tǒng) Windows、Linux、Unix,智能手機系統(tǒng) Android、iOS、WinPhone, 嵌入式系統(tǒng) QNX、VxWorks 等等。
Qt 雖然經常被當做一個 GUI 庫,用來開發(fā)圖形界面應用程序,但這并不是 Qt 的全部;Qt 除了可以繪制漂亮的界面(包括控件、布局、交互),還包含很多其它功能,比如多線程、訪問數據庫、圖像處理、音頻視頻處理、網絡通信、文件操作等,這些 Qt 都已經內置了。
在探索前期安裝過程也是出現(xiàn)了星星點點的未知錯誤,摸黑探路,繞了許多彎路。
最近由于項目需要做國產系統(tǒng)適配,軟件需要適配不同架構CPU!基于此特將經驗寄予此文,望更多志同道合的朋友在這條探索的路上少走彎路,盡入主題!
環(huán)境:
PC系統(tǒng):Ubutu20.04(x86_64架構) <本機>
Qt版本:Qt5.12.8(GCC 9.3.0,64bit) <本機>
Qt Creator 版本:4.11.0 <本機>
交叉編譯器:gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu <本機>
國產系統(tǒng):Kylin Linux Advanced Server release V10(4.19.90-25.10.v2101.ky10.aarch64) 部署環(huán)境<即arm64架構>
GCC:v8.3.0 部署環(huán)境<即arm64架構>
1. 查看系統(tǒng)架構相關指令
Ubutu 本機
uname
uname -a
uname -i
uname -r
lsb_release -a
lsb_release -i
lsb_release -r
Kylin Linux 部署環(huán)境<即arm64架構>
uname
uname -a
uname -i
uname -r
nkvers
查看CPU核數,它會顯示邏輯核心數:
lscpu
nproc
2. ARM64交叉編譯器環(huán)境搭建
1) 選定編譯工具: gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu <可選其他版本>
2) 源碼安裝交叉編譯工具:
源碼安裝指定版本是為適配所部署的環(huán)境v8.3.0 ,筆者安裝了指定版本,大家沒有特殊需求可參考 3)指令安裝交叉編譯工具
①下載: 注1:
從arm Developer 下載指定版本編譯器;
注2:
這里還可以通過百度網盤下載v8.3.0
② 安裝: 解壓:
tar -xvf gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz
重命名:
mv gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu aarch64-linux-gnu-8.3.0
將目標復制到指定目錄下:
<一般復制到 /opt 目錄下,筆者復制到 ~/path/go 目錄下>
sudo cp -rf aarch64-linux-gnu-8.3.0/ /opt
or
mkdir -p ~/path/go
cp -rf aarch64-linux-gnu-8.3.0/ ~/path/go
然后在環(huán)境變量里 /etc/profile <筆者在此文件添加>或 ~/.bashrc 添加全局變量 <注意添加自己正確路徑,筆者前面未重命名>
$PATH:后面路徑為gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin的解壓路徑
sudo vim /etc/profile
#borrieguo add arm aarch64
export PATH=$PATH:~/path/go/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin
然后加載環(huán)境變量<添加在那個文件就source那個>
source /etc/profile
or
source ~/.bashrc
查看配置是否成功:輸入aarch64 +TAB是否出現(xiàn)提示(有對應版本即表示配置成功):
查看安裝路徑:
which aarch64-linux-gnu-gcc-8.3.0
3) 指令安裝交叉編譯工具: 源碼安裝交叉編譯工具和指令安裝交叉編譯工具選其中一個操作即可
指令安裝自動適配本機合適版本,無需指定較為方便
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
安裝后驗證下是否ok,直接輸aarch64- 加Tab鍵如果能自動補全aarch64-linux-gnu-gcc那就問題不大。
查看版本信息:
aarch64-linux-gnu-gcc -v
能查到如下圖所示,說明安裝完成。
查看安裝路徑:
which aarch64-linux-gnu-gcc
4) 編譯源碼測試:
為了進一步驗證交叉編譯器環(huán)境搭建是否搭建成功,可進行編譯源碼進行驗證測試。(可省略)
筆者驗證的是一個C++程序。main.cpp 內容如下:
#include <iostream>
using namespace std;
int main()
{
cout << "Hello World!" << endl;
return 0;
}
將 main.cpp 源碼編譯成arm64可執(zhí)行文件,指令如下:
aarch64-linux-gnu-g++ -o main main.cpp
編譯通過后通過file
指令查看文件類型是否是ELF:64bit LSB shared object,ARM aarch64...
。如果是,則完成源碼編譯。
file main
也可通過readelf -h
指令查看文件系統(tǒng)架構是否是AArch64
。如果是,則完成源碼編譯。
readelf -h main
3. Qt編譯arm64環(huán)境搭建
1) 選定Qt版本: 5.12.8 <可選其他版本>
2) Qt源碼下載:
因為后面要在開發(fā)板上跑Qt程序,所以必須下載Qt源碼包,然后用交叉編譯工具進行編譯,才能得到在目標平臺上可以運行的Qt SDK。筆者本機上的Qt版本為Qt5.12.8(GCC 9.3.0,64bit) ,故下載Qt5.12.8的源碼,目的就是在本機上構建兩個Qt環(huán)境(x86_64和arm64)。實現(xiàn)在本機的PC上配置ARM64的編譯環(huán)境,在本機的PC上編譯完成后,配置Qt交叉編譯環(huán)境,然后再用Qt編譯自己寫的代碼,最后copy部署到ARM平臺上運行即可。注1:
Qt官網下載地址
注2:
百度網盤下載v5.12.8
3) Qt源碼安裝:
①解壓:
下載了qt-everywhere-src-5.12.8.tar.xz,然后通過xz命令解壓出qt-everywhere-src-5.12.8.tar文件,再通過tar命令解壓qt-everywhere-src-5.12.8.tar文件,得到文件夾:qt-everywhere-src-5.12.8。
xz -d qt-everywhere-src-5.12.8.tar.xz
tar -xvf qt-everywhere-src-5.12.8.tar
or
tar -xvf qt-everywhere-src-5.12.8.tar.xz
②定義SDK安裝路徑強烈不建議在Qt源碼的目錄下直接進行編譯,那樣會污染源碼所在目錄。建議在Qt源碼所在的同級目錄下,新建一個文件夾用來存放編譯過程中產生的臨時文件。一定要注意源碼路徑不能含有中文!
創(chuàng)建編譯過程路徑:
mkdir Qt-5.12.8-build
創(chuàng)建最終安裝路徑:
mkdir Qt-5.12.8-arm64
③安裝安裝準備1)
打開 qt-everywhere-src-5.12.8/qtbase/mkspecs/linux-aarch64-gnu-g++/qmake.conf 配置文件,并修改為如下所示內容 ,因為一會我們要用到這個里面的內容,所以我們要先修改一下這里面的編譯器。
根據自己的交叉編譯器來進行編譯修改,本機的交叉編譯器為aarch64-linux-gnu-
如下所示:
注:上面的qmake.conf文件中,如果Ubuntu有好多個交叉編譯器,一定要在交叉編譯器前面加絕對路徑,不然就會像我一開始make的時候會出現(xiàn)“not found”這些錯誤,或者出現(xiàn)下面這些錯誤
Makefile:51: recipe for target ‘sub-corelib-make_first’ failed
make[2]: *** [sub-corelib-make_first] Error 2
make[2]: Leaving directory ‘~/path/qt/qt-everywhere-opensource-src-5.12.8/qtbase/src’
Makefile:46: recipe for target ‘sub-src-make_first’ failed
make[1]: *** [sub-src-make_first] Error 2
make[1]: Leaving directory ‘~/path/qt/qt-everywhere-opensource-src-5.12.8/qtbase’
Makefile:77: recipe for target ‘module-qtbase-make_first’ failed
make: *** [module-qtbase-make_first] Error 2
安裝準備2)
進入Qt-5.12.8-build文件夾執(zhí)行configure
./../qt-everywhere-src-5.12.8/configure -prefix /home/airobot/path/qt/Qt-5.12.8-arm64 -make libs -xplatform linux-aarch64-gnu-g++ -skip qtdeclarative -no-opengl
說明:
-prefix 代表你的安裝文件夾,即上面定義的最終安裝路徑,注意目錄要對應;
-xplatform 代表你所制定的編譯器;
-no-opengl -no表示不編譯該模塊;跳過編譯openGL(因為我已經安裝了Qt,所以不需要界面);
-skip qtdeclarative 跳過 qtdeclarative編譯;
其它參數:
-opensource 編譯開源版 -commercial 編譯商業(yè)版 (參數可選);
-static 生成靜態(tài)庫.a文件 -shared 生成動態(tài)庫so文件 (參數可選,默認是shared)注:靜態(tài)庫與動態(tài)庫區(qū)別是在生成目標文件的鏈接方式上,靜態(tài)庫采用靜態(tài)鏈接,在生成的目標文件(如執(zhí)行文件)中會包含庫文件代碼,而動態(tài)庫在程序編譯時并不會被連接到目標代碼中,而是在程序運行時才被載入。
-force-debug-info 強制生成調試信息 (參數可選)這個參數是讓Qt release版本也生成.pdb文件。這個文件有什么作用呢?它就是我們在release版本下設置了異常捕獲信息函數,打印出錯堆棧信息所必須的文件。如果程序沒用開啟異常捕獲選項,是不需要開啟這個參數的。
-opengl dynamic 指定opengl庫 (參數可選)OpenGL(全寫Open Graphics Library)是指定義了一個跨編程語言、跨平臺的編程接口規(guī)格的專業(yè)的圖形程序接口。它用于三維圖像(二維的亦可),是一個功能強大,調用方便的底層圖形庫。 OpenGL? 是行業(yè)領域中最為廣泛接納的 2D/3D 圖形 API,其自誕生至今已催生了各種計算機平臺及設備上的數千優(yōu)秀應用程序。 OpenGL? 是獨立于視窗操作系統(tǒng)或其它操作系統(tǒng)的,亦是網絡透明的。在包含CAD、內容創(chuàng)作、能源、娛樂、游戲開發(fā)、制造業(yè)、制藥業(yè)及虛擬現(xiàn)實等行業(yè)領域中,OpenGL? 幫助程序員實現(xiàn)在 PC、工作站、超級計算機等硬件設備上的高性能、極具沖擊力的高視覺表現(xiàn)力圖形處理軟件的開發(fā)。
-skip 跳過該模塊
-nomake 不編譯該模塊
-mp 啟動多核編譯
注:-skip和-nomake都可省略,但是-skip qtdeclarative這個參數不能省略,qtdeclarative模塊有需要依賴的庫,這里不跳過編譯會失敗。
如果有別的需求,可以./configure -help查看具體命令
也可使用“vim autoconfigure.sh”命令,新建“autoconfigure.sh”腳本,然后我們需要用 configure 生成下 Makefile,因為命令比較長,我們一般都是創(chuàng)建一個腳本,然后執(zhí)行我們這個腳本生成 Makefile。
autoconfigure.sh 如下:
#!/bin/sh
#export PATH=$PATH:~/path/go/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin
./../qt-everywhere-src-5.12.8/configure -prefix ~/path/qt/Qt-5.12.8-arm64 \
#-static \
#-release \
-opensource \
-make libs \
-xplatform linux-aarch64-gnu-g++ \
#-optimized-qmake \
#-pch \
#-qt-libjpeg \
#-qt-zlib \
-no-opengl \
#-skip qt3d \
#-skip qtcanvas3d \
#-skip qtpurchasing \
#-no-sse2 \
#-no-sse3 \
#-no-ssse3 \
#-no-sse4.1 \
#-no-sse4.2 \
#-no-avx \
#-no-avx2 \
#-no-mips_dsp \
#-no-mips_dspr2 \
#-qt-zlib \
#-no-openssl \
#-no-xcb \
#-no-cups \
#-no-iconv \
#-no-evdev \
#-no-icu \
#-no-fontconfig \
#-nomake examples \
#-nomake tools \
#-skip qtvirtualkeyboard \
#-qpa linuxfb \
#-no-opengl \
#-no-libinput \
#-no-gstreamer \
#-no-system-proxies \
#-no-slog2 \
#-no-lgmon \
#-linuxfb \
#-v \
#-qt-libjpeg \
#-qt-libpng \
#-no-libproxy \
#-no-dbus \
#-no-glib \
#-no-compile-examples \
-skip qtdeclarative \
修改權限:
sudo chmod +x autoconfigure.sh
執(zhí)行腳本:
./autoconfigure.sh
提示選擇版本,輸入o,回車
詢問是否接受協(xié)議,輸入y,回車
安裝準備3)
編譯及安裝
大概編譯十來分鐘
make -j4 2>&1 | tee build.log
make install
完成后進入~/path/qt/Qt-5.12.8-arm64/lib路徑,可以查看文件屬性。系統(tǒng)架構為AArch64
readelf -h libQt5DBus.so
這就是我們需要的東西,到時候拷貝到開發(fā)板
4. 配置 Qt的本地aarch64交叉編譯器
1) 編譯器(Compliers)配置:
編譯器(Compliers)安裝完交叉編譯工具,系統(tǒng)能自動找到。如果找不到需要自己通過添加(Add)按鈕添加
which aarch64-linux-gnu-gcc
which aarch64-linux-gnu-g++
添加步驟:
C++編譯器
配置完成通過Apply按鈕應用生效。
C編譯器
配置完成通過Apply按鈕應用生效。
2) Qt版本(Qt Versions)配置:
Qt Versions需要添加一個自定義的版本,qmake需要剛編譯安裝后的qmake
配置完成通過Apply按鈕應用生效。
3) 構建套件(Kit)配置:
Kit需要選擇好自己新添加的Qt Version和編譯器。
配置完成通過Apply按鈕應用生效,通過OK按鈕配置完成。
5. 工程建立及編譯驗證
新建工程,并選擇上面配置的構建套件(Kit)
編譯后得到可執(zhí)行文件:
可執(zhí)行文件為ARM aarch64架構,驗證成功!
至此,恭喜您!Qt的交叉編譯環(huán)境已成功安裝,可以開始使用了!?。?/strong>
下一個教程將講述: Qt教程4-Ubuntu(x86_64)上用QEMU建立arm64(aarch64)的模擬開發(fā)環(huán)境,讓您編譯的ARM aarch64架構的程序在本機能夠實現(xiàn)運行驗證!
后續(xù)教程還將講述: Qt教程5-Ubuntu(x86_64)上交叉編譯的QT程序SSH直接部署到遠程國產系統(tǒng)(ARM aarch64架構),讓您在本機Qt開發(fā)的ARM aarch64架構程序,通過配置 Qt的SSH aarch64交叉編譯器,從而共享所要部署的環(huán)境來直接在本機Qt上實現(xiàn)運行驗證!文章來源:http://www.zghlxwxcb.cn/news/detail-818041.html
感謝閱讀,我是匯創(chuàng)慧玩,希望文章能夠解決您的問題。
事為之,須極致!文章來源地址http://www.zghlxwxcb.cn/news/detail-818041.html
到了這里,關于Qt教程3-Ubuntu(x86_64)上配置arm64(aarch64)交叉編譯環(huán)境及QT編譯arm64架構工程的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!