我們假定如下條件:
- 需要構建的是 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
命令可查看已安裝的軟件包列表。