Linux 系統構建 Qt


我們假定如下條件:

  • 需要構建的是 Qt 5.9.9 版本。
  • 系統使用 apt 軟件包管理器。
  • 如果對文中的一些內容有疑惑,可嘗試查看文末的附加信息。

安裝 C/C++ 編譯環境 (如果已安裝請跳過):

執行 sudo apt-get install build-essential 即可完成 C/C++ 編譯環境的安裝。

如果不存在 build-essential 軟件包,那么我們需要自行安裝 gcc、g++ 編譯器等內容。

確保以下 Qt 所依賴的軟件包都已安裝:

libfontconfig1-dev  	(如果未安裝將導致 Qt 找不到字體,進而出現中文不顯示問題)
libfreetype6-dev    	(字體引擎,提供統一的接口來訪問多種格式的字體文件)
libx11-dev          	(X11 開發包)
libxext-dev         	(X11 雜項擴展庫)
libxfixes-dev       	(X11 雜項 “修復” 擴展庫)
libxi-dev           	(為 X 協議的 XINPUT 提供擴展接口)
libxrender-dev      	(X 渲染擴展庫)
libxcb1-dev         	(Xlib 的替代實現)
libx11-xcb-dev      	(Xlib 和 XCB 的混合接口庫)
libxcb-glx0-dev     	(XCB 的 GLX 擴展庫)

根據以往經驗,我們還應該確保安裝以下軟件包:

pkg-config		(確保 configure 能夠使用 pkg-config 查找依賴庫信息)
libxkbcommon-dev    	(Qtfcitx 模塊的依賴項)
libxkbcommon-x11-dev	(Qt 內部會將其與 xcb 結合使用,如果不想安裝可選擇使用 -qt-xkbcommon-x11 選項替代 (未驗證))

如果不使用 -qt-xcb 編譯選項,還應該確保安裝以下軟件包(通常我們都使用 -qt-xcb 選項):

libxcb-keysyms1-dev
libxcb-image0-dev
libxcb-shm0-dev
libxcb-icccm4-dev
libxcb-sync0-dev
libxcb-xfixes0-dev
libxcb-shape0-dev
libxcb-randr0-dev
libxcb-render-util0-dev

其它根據情況推薦安裝的模塊:

libgl1-mesa-dev     (Qt OpenGL 的依賴項)
libdbus-1-dev       (QtDBus 模塊的依賴項)
libgstreamer*‑dev   (QtMultimedia 模塊的后端依賴項)

構建 openssl 庫 (如果不需要 openssl 支持或已安裝對應版本的 openssl 庫,可跳過):

openssl 庫的二進制兼容性很差,放到 Qt 上更是如此。

一旦 Qt 沒有加載到兼容版本的 openssl 庫將會出現 "建立網絡連接時卡死"、"程序退出時崩潰" 的情況。

因此我們選擇自行構建對應版本的 openssl 庫,並在軟件發布時自包含 openssl 庫。

Qt 5.9 Tools and Versions 頁面的 Tools & Versions 一節,我們可以了解到官方發布 Qt5.9 時所使用的 openssl 版本為 1.0.2。
因此我們下載 openssl-1.0.2 的源碼進行構建。
下載並解壓后,進入源碼目錄下使用如下步驟完成構建:

./config shared -prefix=/usr/local/ssl
make -j4
sudo make install

# -prefix 指定 openssl 的安裝目錄,可根據需要自行修改

構建 Qt:

我們可以從 這里 下載到 Qt 的源碼。
下載完成后,使用如下步驟完成構建:

mkdir -p ~/build/qt
cd ~/build/qt

# 將 Qt 源碼放至當前目錄 ...

# 解壓源碼
tar -xJvf qt-everywhere-opensource-src-5.9.9.tar.xz

# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# 注意:
# Qt 5.11.1 之前的版本采用 shadow build 方式進行構建時會出現
# Qt*Config.cmake 文件不包含私有頭文件引入的問題,因此在進行構
# 建前需要合並 bug 補丁:
# https://codereview.qt-project.org/c/qt/qtbase/+/227458
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

mkdir ~/build/qt/build
cd ~/build/qt/build

# 執行 configure,以下選項針對 Qt5.9.9 編寫,一些內容可能並不適用,請根據情況進行修改。
~/build/qt/qt-everywhere-opensource-src-5.9.9/configure \
-opensource -confirm-license \		 		(使用開源許可協議構建 Qt,自動確認 license 提示)
-prefix /usr/lib/aarch64-linux-gnu/qt5.9.9 \		(指定 Qt 的安裝目錄,可根據需要自行指定)
-recheck \						(要求 configure 每次執行都進行檢測)
-qt-xcb \ 						(使用 Qt 自帶的一些 xcb 組件庫,減少 Qt 對系統 xcb 組件庫的依賴)	
-qt-zlib -qt-libjpeg -qt-libpng \			(使用 Qt 自帶的 jpeg、png 庫)
-fontconfig \						(指明啟用 fontconfig 支持)
-openssl \						(指明啟用 openssl 支持)
-I /usr/local/ssl/include \				(將我們自己構建的 openssl 庫添加至包含路徑,防止 Qt 引入其它版本的庫進行編譯)
-opengl -sql-sqlite \					(指明啟用 opengl、sqlite 支持)
-no-gtk \						(禁用 gtk 主題樣式)
-nomake tests -nomake examples \			(跳過這些無關緊要模塊的構建)

以下是我們選擇不構建的 Qt 組件模塊,可根據需要自行調整:

-skip qtactiveqt -skip qt3d -skip qtandroidextras -skip qtconnectivity -skip qtcanvas3d \
-skip qtgamepad -skip qtlocation -skip qtpurchasing -skip qtsensors \
-skip qtserialbus -skip qtserialport -skip qtnetworkauth -skip qtspeech -skip qtremoteobjects \
-skip qtdatavis3d -skip qtdeclarative -skip qtwebengine

如果不需要 QML 相關功能可指定這些:

-skip qtquickcontrols -skip qtquickcontrols2 -skip qtscript -skip qtgraphicaleffects

如果不需要 QtDataVisualization 功能模塊可指定:

-skip qtdatavis3d

-skip 可取的值為 Qt 源碼目錄下的那些頂級目錄(如 qtconnectivity)。
請注意,一個頂級目錄下可能包含多個 Qt 功能模塊。(可通過其 src 子目錄下的目錄划分看出其所包含的功能模塊)
目前暫沒有找到好的方法單獨 skip Qt 功能模塊的構建。

等待 configure 執行完畢,並檢查其輸出信息沒有問題后,我們就可以進行 Qt 的編譯和安裝了:

make
sudo make install

構建 Fcitx 輸入法支持:

如果系統使用的是 Fcitx 輸入法,那么 Qt 程序將會出現無法使用輸入法的情況,這是因為Qt 本身不支持 Fcitx 輸入法,因此我們需要自行構建 fcitx-qt5 插件以為其添加支持。

具體的構建過程可以參閱博主 flfihpv259 的博文: QT5.6.0無法切換fcitx中文輸入法問題記錄
在此不再贅述,僅多提及幾點:

  • 下載 fcitx-qt5 源碼時通常選擇其最新穩定版的 tag。(對於其它開源軟件來說也是如此)

  • ECM 軟件包全稱為 Extra CMake Modules,其通常有現成的軟件包 extra-cmake-modules 可供安裝。

  • XKBCommon 通常有現成的軟件包 libxkbcommon-dev 可供安裝。

  • 如果出現找不到 Qt*Config.cmake 文件錯誤,可在執行 cmake 時指定 CMAKE_PREFIX_PATH 來添加包含路徑:

    cmake -DCMAKE_PREFIX_PATH=/usr/lib/aarch64-linux-gnu/qt5.9.9/lib/cmake ..

  • 如果系統上已經安裝了其它版本的 Qt ,那么有可能找到錯誤版本的 Qt*Config.cmake 文件,這也可以通過指定 CMAKE_PREFIX_PATH 來解決。

  • 如果出現 Parse error at "IID" 錯誤,這是由於找不到 Qt 私有頭文件導致的,請確保構建 Qt 時應用了 227458 補丁。

至此我們已完成 Qt 的完整構建,以下是一些可能對你有幫助的附加信息:

  • 可參見對應 Qt 版本的 Qt for X11 Requirements 頁面查閱 Qt 對外部庫的基本依賴情況。

  • 可通過 Building Qt for Linux/es 頁面詳細了解 Qt 對外部庫的詳細依賴情況(只不過有點舊了)。

  • 可參見 Qt Configure Options 頁面了解 configure 的使用說明。

  • 如果你是商業版的用戶,或許你可以直接使用 Qt Configuration Tool 來構建 Qt。

  • 合並 227458 補丁的方法:

    qtbase/mkspecs/features/create_cmake.prf 在不同版本之間可能有差異,但大體上只需要確保刪除文件中對於 CMAKE_NO_PRIVATE_INCLUDES 的定義和訪問代碼即可。

  • 通過 apt list --installed 命令可查看已安裝的軟件包列表。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM