在硬件板卡提供商提供的嵌入式linux平臺(tái)下的Qt環(huán)境中,很多時(shí)候會(huì)存在許多問(wèn)題:
(1)可能一些Qt的模塊不支持。這時(shí)候要么找廠家,要么自己編譯。
(2)在廠家提供的平臺(tái)開發(fā)環(huán)境中,支持的東西太多,太雜,導(dǎo)致整個(gè)文件系統(tǒng)鏡像太大。這時(shí)候?yàn)榱藴p小根文件系統(tǒng),往往需要自己集成和編譯開發(fā)環(huán)境。
(3)不同版本Qt編譯構(gòu)建出的庫(kù)文件,一般會(huì)不兼容,需要針對(duì)特定版本進(jìn)行交叉編譯。
本文主要是記錄在Qt源碼跨平臺(tái)源碼編譯構(gòu)建過(guò)程中的一些注意點(diǎn)以及自己的思考。因平臺(tái)太多,軟件環(huán)境大多不同,故不會(huì)針對(duì)特定平臺(tái)進(jìn)行詳細(xì)步驟描述,所以記錄些共同點(diǎn),細(xì)節(jié)點(diǎn)就略過(guò)啦。如果有疑問(wèn),可以加小生微信相互交流,互相學(xué)習(xí),哈哈!
編譯Qt源碼,首先就獲取源碼,從Qt官方網(wǎng)站https://download.qt.io/archive/qt/獲取源碼。將其解壓縮,完成后如下圖所示:
從目錄結(jié)構(gòu)來(lái)觀察,源碼結(jié)構(gòu)以模塊方式高度劃分。Qt的各個(gè)模塊都可以單獨(dú)編譯,當(dāng)然一般使用最多的是整體編譯。在使用工具(例如buildroot)制作嵌入式linux根文件系統(tǒng)時(shí),對(duì)Qt部分是自動(dòng)編譯的(暫不清楚里面的構(gòu)建細(xì)節(jié))
在上圖中,有一個(gè)qtbase目錄,該目錄是Qt的基礎(chǔ)模塊目錄,該目錄下同樣有configure文件(在源碼目錄下也有一個(gè)configure配置文件,這兩個(gè)文件不一樣)
在Qt源碼目錄下執(zhí)行:
./configure--help
會(huì)打印出幫助信息,在/qtbase目錄下使用上述命令同樣會(huì)打印幫助信息,只是在此處打印出的信息比在源碼目錄下使用confiigure --help命令打印出的幫助信息少。
當(dāng)我們?cè)赒t源碼目錄下執(zhí)行./configure命令時(shí),可以配置整體編譯方案,我們則可以在此處設(shè)置想要編譯構(gòu)建的參數(shù)和模塊。
在/qtbase目錄下,執(zhí)行./configure命令時(shí),配置的是在該目錄下的Qt基本模塊。從源碼目錄結(jié)構(gòu),可以知道在qtbase模塊下包含許多子模塊:
其中包含:core、network、sql、widget等。
只編譯構(gòu)建qtbase,開發(fā)運(yùn)行常見(jiàn)窗體應(yīng)用是可以的
mkspecs目錄
在qtbase目錄下,存放了多個(gè)目錄,如下圖所示:
因?yàn)镼t是跨平臺(tái)的,在該目錄下則存放了許多與具體平臺(tái)相關(guān)的目錄,目錄的名稱則是以具體架構(gòu)來(lái)命名,且目錄中存放了兩個(gè)文件:
qmake.conf:該文件是關(guān)于具體架構(gòu)的qmake配置描述,一般內(nèi)容格式如下:
# #qmakeconfigurationforbuildingwithaarch64-linux-gnu-g++ # MAKEFILE_GENERATOR=UNIX CONFIG+=incremental QMAKE_INCREMENTAL_STYLE=sublib include(../common/linux.conf) include(../common/gcc-base-unix.conf) include(../common/g++-unix.conf) #modificationstog++.conf QMAKE_CC=aarch64-linux-gnu-gcc QMAKE_CXX=aarch64-linux-gnu-g++ QMAKE_LINK=aarch64-linux-gnu-g++ QMAKE_LINK_SHLIB=aarch64-linux-gnu-g++ #modificationstolinux.conf QMAKE_AR=aarch64-linux-gnu-arcqs QMAKE_OBJCOPY=aarch64-linux-gnu-objcopy QMAKE_NM=aarch64-linux-gnu-nm-P QMAKE_STRIP=aarch64-linux-gnu-strip load(qt_config)
qplatformdefs.h:該文件是一個(gè)頭文件,文件中內(nèi)容用于描述具體模塊層級(jí)包含的相關(guān)頭文件依賴。
qmake.conf是一個(gè)重要的文件,在針對(duì)具體平臺(tái)編譯構(gòu)建源碼時(shí),可能需要修改該文件下的內(nèi)容:
在上述圖片中,等號(hào)右邊表示具體的編譯構(gòu)建工具名稱。需要提前安裝對(duì)應(yīng)的編譯套件且將他們添加到環(huán)境變量中(如果沒(méi)有添加,可以以絕對(duì)路徑來(lái)描述)。例如,如果是在linux平臺(tái)下,且將編譯器添加到了環(huán)境變量中,可以使用編譯器名稱加上v參數(shù)選項(xiàng)查看編譯器信息,此處以交叉編譯器aarch64-linux-gnu為例:
編譯構(gòu)建qtbase
本小節(jié)以在ubuntu系統(tǒng)下,交叉編譯Arm64平臺(tái)的Qt版本為目標(biāo)。記錄qtbase的編譯構(gòu)建步驟。
交叉編譯器為:gcc-linara-6.3.1-2017.05-x86_64_aarch64-linux-gnu
(1)準(zhǔn)備好交叉編譯工具后,將交叉編譯器的路徑添加到ubuntu環(huán)境變量中。參見(jiàn)《一文分享linux的環(huán)境變量》一文。
(2)在源碼目錄下使用cd qtbase將終端切換到qtbase目錄下。
(3)查看/qtbase/mkspecs/linux-aarch64-gnu-g++/qmake.conf文件內(nèi)容。編譯器一欄所填寫的命令,需要與交叉編譯器套件名稱一樣。小生的交叉編譯器套件如下圖所示:
(經(jīng)對(duì)比,qmake.conf文件中交叉編譯器名稱與上圖所示名稱一樣,故此處不用修改qmake.conf文件)
(4)在終端使用下列命令:
./configure -prefix編譯安裝的目錄路徑 -xplatformlinux-aarch64-gnu-g++ -no-opengl -opensource -confirm-license -release -strip -shared -c++stdc++11 --sqlite=qt -recheck-all
(注:可以將上述內(nèi)容寫成腳本,直接在終端下運(yùn)行即可)
-prefix:該參數(shù)用于指定Qt編譯完成后安裝時(shí)的輸出目錄。
-xplatform:用于交叉編譯時(shí)選擇目標(biāo)mkspec。(需與qtbase/mkspec目錄下的目錄名稱一樣)
其他參數(shù)含義可以使用./configure -help打印出幫助信息查看。
(5)使用make -j12編譯構(gòu)建qtbase。(-j12表示同時(shí)允許的任務(wù)數(shù),計(jì)算機(jī)性能好,就指定12或更高。計(jì)算機(jī)性能弱就指定低數(shù)值或不指定-j參數(shù))
注:根據(jù)編譯構(gòu)建環(huán)境的硬件配置,整個(gè)編譯構(gòu)建過(guò)程可能會(huì)需要幾分鐘甚至幾十分鐘。
(6)編譯完成后,在終端使用make install命令將編譯成功后的文件安裝到-prefix參數(shù)指定的路徑下。
安裝完成后,會(huì)在-prefix參數(shù)指定的路徑下自動(dòng)創(chuàng)建幾個(gè)目錄,如下圖所示:
bin:該目錄下包含生成的Qt版本的二進(jìn)制程序。例如:moc、qmake、rcc、uic等Qt構(gòu)建工具。
doc:為對(duì)應(yīng)模塊的文檔目錄。
examples:該目錄中存放的是與該模塊相關(guān)的Qt演示demo(源碼+生成的可執(zhí)行體)。
include:該目錄存放與該模塊相關(guān)的包含頭文件。
lib:該目錄下存放的是與該模塊相關(guān)的庫(kù)文件。
plugins:該目錄下存放插件目錄,在對(duì)應(yīng)插件目錄下存放著對(duì)應(yīng)的插件庫(kù)文件。
在上述過(guò)程中,我們已經(jīng)編譯構(gòu)建且安裝好了qtbase,如果在開發(fā)中,還想增加其他的組件模塊,我們可以直接到模塊對(duì)應(yīng)的目錄路徑下編譯即可。例如,如果想編譯構(gòu)建qtcharts模塊,可以按照如下步驟進(jìn)行:
(1)切換到qtcharts目錄路徑下,打開終端。
(2)用在qtbase編譯出的qmake工具來(lái)配置(這個(gè)qmake會(huì)自動(dòng)延用qtbase交叉編譯時(shí)的配置),qmake工具位于-prefix參數(shù)指定的路徑下的bin目錄中:
編譯安裝的目錄路徑/bin/qamke
(3)使用make -j12編譯構(gòu)建。
(4)使用make install安裝。
完整編譯構(gòu)建Qt源碼
完整編譯Qt源碼指的是在Qt源碼路徑下進(jìn)行編譯,使用configure對(duì)Qt進(jìn)行編譯配置時(shí)指定需要編譯的模塊。
完整編譯構(gòu)建步驟如下:
(1)與上述編譯qtbase一樣,需要確保準(zhǔn)備好了交叉編譯器環(huán)境,且配置好具體目標(biāo)平臺(tái)下的qmake配置文件,然后在Qt源碼目錄下打開終端。
(2)使用下列命令配置Qt源碼:
#!/bin/sh ./configure-prefix/home/Qt/qt-everywhere-src-5.12.9/arm-qt -opensource -confirm-license -release -strip -shared -xplatformlinux-arm-gnueabi-g++ -optimized-qmake -c++stdc++11 --rpath=no -pch -skipqt3d -skipqtactiveqt -skipqtandroidextras -skipqtcanvas3d -skipqtconnectivity -skipqtdatavis3d -skipqtdoc -skipqtgamepad -skipqtlocation -skipqtmacextras -skipqtnetworkauth -skipqtpurchasing -skipqtremoteobjects -skipqtscript -skipqtscxml -skipqtsensors -skipqtspeech -skipqtsvg -skipqttools -skipqttranslations -skipqtwayland -skipqtwebengine -skipqtwebview -skipqtwinextras -skipqtx11extras -skipqtxmlpatterns -makelibs -makeexamples -nomaketools-nomaketests -gui -widgets -dbus-runtime --glib=no --iconv=no --pcre=qt --zlib=qt -no-openssl --freetype=qt --harfbuzz=qt-no-opengl-linuxfb --xcb=no-tslib --libpng=qt --libjpeg=qt --sqlite=qt -plugin-sql-sqlite -I/home/Qt/tslib-1.21/arm-tslib/include -L/home/Qt/tslib-1.21/arm-tslib/lib -recheck-all
上述的配置文本,可通過(guò)./configure -help查看對(duì)應(yīng)的意思。
參考鏈接:https://doc.qt.io/qt-5/configure-options.html
上述配置跳過(guò)了幾個(gè)Qt模塊,且使用linuxfb作為顯示平臺(tái)插件,為ARM32編譯Qt跨平臺(tái)開發(fā)環(huán)境。
(3)在終端使用make -j12編譯構(gòu)建Qt源碼。
(4)在終端使用make installl命令將編譯成功后的文件安裝到-prefix參數(shù)指定的路徑下。
審核編輯:湯梓紅
-
Linux
+關(guān)注
關(guān)注
87文章
11420瀏覽量
212361 -
源碼
+關(guān)注
關(guān)注
8文章
665瀏覽量
30064 -
Qt
+關(guān)注
關(guān)注
1文章
312瀏覽量
38637
原文標(biāo)題:交叉編譯Qt源碼筆記
文章出處:【微信號(hào):嵌入式小生,微信公眾號(hào):嵌入式小生】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
OpenHarmony開發(fā)學(xué)習(xí):【源碼下載和編譯】

如何編譯ARM版本LINUX QT4.5
【OK210試用體驗(yàn)】之QT編譯過(guò)程中疑惑求解
Linux QT5程序編譯準(zhǔn)備源碼
手動(dòng)編譯QT源碼生成qmake
qt源碼庫(kù)在樹莓派中的部署方法
瑞芯微RK3568開發(fā)板源碼編譯與交叉編譯環(huán)境搭建
嵌入式Linux開發(fā)環(huán)境搭建-(6)交叉編譯QT4.8.7源碼生成qmake工具

搭建一種跨平臺(tái)qt5遠(yuǎn)程編譯環(huán)境

評(píng)論