在硬件板卡提供商提供的嵌入式linux平臺下的Qt環境中,很多時候會存在許多問題:
(1)可能一些Qt的模塊不支持。這時候要么找廠家,要么自己編譯。
(2)在廠家提供的平臺開發環境中,支持的東西太多,太雜,導致整個文件系統鏡像太大。這時候為了減小根文件系統,往往需要自己集成和編譯開發環境。
(3)不同版本Qt編譯構建出的庫文件,一般會不兼容,需要針對特定版本進行交叉編譯。
本文主要是記錄在Qt源碼跨平臺源碼編譯構建過程中的一些注意點以及自己的思考。因平臺太多,軟件環境大多不同,故不會針對特定平臺進行詳細步驟描述,所以記錄些共同點,細節點就略過啦。如果有疑問,可以加小生微信相互交流,互相學習,哈哈!
編譯Qt源碼,首先就獲取源碼,從Qt官方網站https://download.qt.io/archive/qt/獲取源碼。將其解壓縮,完成后如下圖所示:
從目錄結構來觀察,源碼結構以模塊方式高度劃分。Qt的各個模塊都可以單獨編譯,當然一般使用最多的是整體編譯。在使用工具(例如buildroot)制作嵌入式linux根文件系統時,對Qt部分是自動編譯的(暫不清楚里面的構建細節)
在上圖中,有一個qtbase目錄,該目錄是Qt的基礎模塊目錄,該目錄下同樣有configure文件(在源碼目錄下也有一個configure配置文件,這兩個文件不一樣)
在Qt源碼目錄下執行:
./configure--help
會打印出幫助信息,在/qtbase目錄下使用上述命令同樣會打印幫助信息,只是在此處打印出的信息比在源碼目錄下使用confiigure --help命令打印出的幫助信息少。
當我們在Qt源碼目錄下執行./configure命令時,可以配置整體編譯方案,我們則可以在此處設置想要編譯構建的參數和模塊。
在/qtbase目錄下,執行./configure命令時,配置的是在該目錄下的Qt基本模塊。從源碼目錄結構,可以知道在qtbase模塊下包含許多子模塊:
其中包含:core、network、sql、widget等。
只編譯構建qtbase,開發運行常見窗體應用是可以的
mkspecs目錄
在qtbase目錄下,存放了多個目錄,如下圖所示:
因為Qt是跨平臺的,在該目錄下則存放了許多與具體平臺相關的目錄,目錄的名稱則是以具體架構來命名,且目錄中存放了兩個文件:
qmake.conf:該文件是關于具體架構的qmake配置描述,一般內容格式如下:
# #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:該文件是一個頭文件,文件中內容用于描述具體模塊層級包含的相關頭文件依賴。
qmake.conf是一個重要的文件,在針對具體平臺編譯構建源碼時,可能需要修改該文件下的內容:
在上述圖片中,等號右邊表示具體的編譯構建工具名稱。需要提前安裝對應的編譯套件且將他們添加到環境變量中(如果沒有添加,可以以絕對路徑來描述)。例如,如果是在linux平臺下,且將編譯器添加到了環境變量中,可以使用編譯器名稱加上v參數選項查看編譯器信息,此處以交叉編譯器aarch64-linux-gnu為例:
編譯構建qtbase
本小節以在ubuntu系統下,交叉編譯Arm64平臺的Qt版本為目標。記錄qtbase的編譯構建步驟。
交叉編譯器為:gcc-linara-6.3.1-2017.05-x86_64_aarch64-linux-gnu
(1)準備好交叉編譯工具后,將交叉編譯器的路徑添加到ubuntu環境變量中。參見《一文分享linux的環境變量》一文。
(2)在源碼目錄下使用cd qtbase將終端切換到qtbase目錄下。
(3)查看/qtbase/mkspecs/linux-aarch64-gnu-g++/qmake.conf文件內容。編譯器一欄所填寫的命令,需要與交叉編譯器套件名稱一樣。小生的交叉編譯器套件如下圖所示:
(經對比,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
(注:可以將上述內容寫成腳本,直接在終端下運行即可)
-prefix:該參數用于指定Qt編譯完成后安裝時的輸出目錄。
-xplatform:用于交叉編譯時選擇目標mkspec。(需與qtbase/mkspec目錄下的目錄名稱一樣)
其他參數含義可以使用./configure -help打印出幫助信息查看。
(5)使用make -j12編譯構建qtbase。(-j12表示同時允許的任務數,計算機性能好,就指定12或更高。計算機性能弱就指定低數值或不指定-j參數)
注:根據編譯構建環境的硬件配置,整個編譯構建過程可能會需要幾分鐘甚至幾十分鐘。
(6)編譯完成后,在終端使用make install命令將編譯成功后的文件安裝到-prefix參數指定的路徑下。
安裝完成后,會在-prefix參數指定的路徑下自動創建幾個目錄,如下圖所示:
bin:該目錄下包含生成的Qt版本的二進制程序。例如:moc、qmake、rcc、uic等Qt構建工具。
doc:為對應模塊的文檔目錄。
examples:該目錄中存放的是與該模塊相關的Qt演示demo(源碼+生成的可執行體)。
include:該目錄存放與該模塊相關的包含頭文件。
lib:該目錄下存放的是與該模塊相關的庫文件。
plugins:該目錄下存放插件目錄,在對應插件目錄下存放著對應的插件庫文件。
在上述過程中,我們已經編譯構建且安裝好了qtbase,如果在開發中,還想增加其他的組件模塊,我們可以直接到模塊對應的目錄路徑下編譯即可。例如,如果想編譯構建qtcharts模塊,可以按照如下步驟進行:
(1)切換到qtcharts目錄路徑下,打開終端。
(2)用在qtbase編譯出的qmake工具來配置(這個qmake會自動延用qtbase交叉編譯時的配置),qmake工具位于-prefix參數指定的路徑下的bin目錄中:
編譯安裝的目錄路徑/bin/qamke
(3)使用make -j12編譯構建。
(4)使用make install安裝。
完整編譯構建Qt源碼
完整編譯Qt源碼指的是在Qt源碼路徑下進行編譯,使用configure對Qt進行編譯配置時指定需要編譯的模塊。
完整編譯構建步驟如下:
(1)與上述編譯qtbase一樣,需要確保準備好了交叉編譯器環境,且配置好具體目標平臺下的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
上述的配置文本,可通過./configure -help查看對應的意思。
參考鏈接:https://doc.qt.io/qt-5/configure-options.html
上述配置跳過了幾個Qt模塊,且使用linuxfb作為顯示平臺插件,為ARM32編譯Qt跨平臺開發環境。
(3)在終端使用make -j12編譯構建Qt源碼。
(4)在終端使用make installl命令將編譯成功后的文件安裝到-prefix參數指定的路徑下。
審核編輯:湯梓紅
-
Linux
+關注
關注
87文章
11232瀏覽量
208949 -
源碼
+關注
關注
8文章
633瀏覽量
29146 -
Qt
+關注
關注
1文章
301瀏覽量
37837
原文標題:交叉編譯Qt源碼筆記
文章出處:【微信號:嵌入式小生,微信公眾號:嵌入式小生】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論