QT交叉編譯環境配置
- 1 配置交叉編譯工具鏈
- 1.1 解壓 放到`/opt`中
- 1.2 使用環境變量
- 1.2.1 設置成永久的環境變量
- 1.2.2 臨時環境變量
- 1.3 安裝編譯需要的軟件
- 2 編譯tslib庫(如果不需要觸摸屏直接跳過)
- 3. 編譯qt
- 3.1 編譯源碼
- 3.2 設置QCreator
- 4 說明
- 4.1 關于編譯器名字的區別
- 4.2 如果 mkspecs 目錄中沒有你用的編譯器怎么辦?
- 4.3 QT各個模塊的作用
如果遇到疑問,看看第4章 說明
中有沒有能解決你疑惑的答案
1 配置交叉編譯工具鏈
我使用的是gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu
https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/
1.1 解壓 放到/opt
中
sudo tar -xf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar -C /opt
1.2 使用環境變量
export TOOLCHAIN_DIR=/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu
export SYSROOT=${TOOLCHAIN_DIR}/aarch64-linux-gnu/libc
export PATH=${TOOLCHAIN_DIR}/bin:$PATHexport CC=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-gcc
export CXX=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-g++
export AR=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-ar
export LD=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-ld
export RANLIB=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-ranlib
1.2.1 設置成永久的環境變量
sudo vim ~/.bashrc # 打開設置環境變量
#將1.2的內容復制到文件末尾
source ~/.bashrc #使環境變量生效或者#多用戶生效
sudo vim /etc/profile
source /etc/profile
1.2.2 臨時環境變量
方式一:
打開命令窗口,將1.2內容復制到里面運行
方式二:
創建set_arm_env.sh文件,將下面內容復制進去
#!/bin/bash
export TOOLCHAIN_DIR=/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu
export SYSROOT=${TOOLCHAIN_DIR}/aarch64-linux-gnu/libc
export PATH=${TOOLCHAIN_DIR}/bin:$PATHexport CC=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-gcc
export CXX=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-g++
export AR=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-ar
export LD=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-ld
export RANLIB=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-ranlib
執行chmod +x set_arm_env.sh
和 source set_arm_env.sh
驗證方式:
aarch64-linux-gnu-gcc -v
和
echo “CC=$CC”
1.3 安裝編譯需要的軟件
sudo apt update
sudo apt install perl
sudo apt install python3 #或者python2
sudo apt-get install autoconf automake libtool
2 編譯tslib庫(如果不需要觸摸屏直接跳過)
tslib 是一個用于 觸摸屏輸入事件校準和處理 的輕量級開源庫,常用于 嵌入式 Linux 系統 上的電阻式或電容式觸摸屏。
作用:
- 處理觸摸屏原始坐標數據
- 進行觸摸校準(calibration)
- 消除觸摸漂移、誤差
- 提供統一的觸摸事件接口(/dev/input/eventX)
#下載
git clone https://gitee.com/mqinglang/tslib.git
cd tslib
./autogen.sh
./configure --host=aarch64-linux-gnu ac_cv_func_malloc_0_nonnull=yes --cache-file=aarch64-linux.cache -prefix=/home/mql/qt_src/arm64_linux_gnu/tslib
make -j$(nproc)
make install
3. 編譯qt
3.1 編譯源碼
我使用的是qt5.15.2。你在源碼中qt-everywhere-src-5.15.2/qtbase/mkspecs
這個路徑下面會看到各個平臺的編譯配置文件,我用的是arm64-linux-gnu這里面已經包含了這個編譯器的編譯配置如圖:
qmake.conf里面是編譯配置:
- 詳細解釋如下
#這是注釋,說明此配置是針對 aarch64-linux-gnu-g++ 交叉編譯器的。
# qmake configuration for building with aarch64-linux-gnu-g++
# 指定生成的 Makefile 格式是 Unix 風格。
MAKEFILE_GENERATOR = UNIX
# 這是增量構建的設置,incremental 表示支持增量鏈接(部分模塊重編譯);
# sublib 說明增量編譯模式按子庫為單位。
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib
# 引入 Qt 提供的通用 Linux + GCC 配置。
# 這些 conf 文件位于 qtbase/mkspecs/common/ 下,封裝了 GCC 編譯選項和 Linux 系統默認參數。
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
# 指定交叉編譯所使用的編譯器為 aarch64-linux-gnu-gcc 和 aarch64-linux-gnu-g++
# modifications to g++.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++
# 設置歸檔工具(生成 .a 靜態庫)等。用于構建時壓縮/提取符號:
# modifications to linux.conf
QMAKE_AR = aarch64-linux-gnu-ar cqs
QMAKE_OBJCOPY = aarch64-linux-gnu-objcopy
QMAKE_NM = aarch64-linux-gnu-nm -P
QMAKE_STRIP = aarch64-linux-gnu-strip
- 變量名 含義
QMAKE_CC C 編譯器
QMAKE_CXX C++ 編譯器
QMAKE_LINK 鏈接器(C++)
QMAKE_LINK_SHLIB 動態庫鏈接器(C++)
QMAKE_AR 靜態庫打包工具
QMAKE_OBJCOPY 對目標文件進行復制、符號剝離等操作
QMAKE_NM 顯示目標文件符號表
QMAKE_STRIP 剝離調試信息/符號表
# 下載
wget https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/qt/5.15/5.15.2/single/qt-everywhere-src-5.15.2.tar.xz
# 解壓
tar -xf qt-everywhere-src-5.15.2.tar.xz
cd qt-everywhere-src-5.15.2/
創建一個腳本qtsrc.sh,記得將里面的路徑修改成你自己對應的,然后加執行權限
#!/bin/bashecho "設置交叉編譯工具鏈環境變量..."
export TOOLCHAIN_DIR=/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu
export SYSROOT=${TOOLCHAIN_DIR}/aarch64-linux-gnu/libc
export PATH=${TOOLCHAIN_DIR}/bin:$PATHexport CC=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-gcc
export CXX=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-g++
export AR=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-ar
export LD=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-ld
export RANLIB=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-ranlibecho "設置 TSLIB 相關路徑..."
export TSLIB_ROOT=/home/mql/qt_src/arm64_linux_gnu/tslib
export PKG_CONFIG_SYSROOT_DIR=$SYSROOT
export PKG_CONFIG_PATH=$TSLIB_ROOT/lib/pkgconfig
export TSLIB_INCLUDE_DIR=$TSLIB_ROOT/include
export TSLIB_LIBRARY_DIR=$TSLIB_ROOT/libecho "開始執行 Qt configure 配置..."
./configure \-prefix /home/mql/qt_src/arm64_linux_gnu/qt5.15.2 \-release \-opensource -confirm-license \-optimized-qmake \-shared \-xplatform linux-aarch64-gnu-g++ \-pch \-c++std c++11 \-linuxfb \-tslib \-qt-zlib \-qt-pcre \-qt-freetype \-qt-harfbuzz \-qt-libpng \-qt-libjpeg \-qt-sqlite \-plugin-sql-sqlite \-gui -widgets -dbus-runtime \-no-openssl \-no-xcb \-no-opengl \-nomake tests \-nomake examples \-recheck-all \-I $TSLIB_INCLUDE_DIR \-L $TSLIB_LIBRARY_DIR \-skip qtnetworkauth \-skip qtwebsockets \-skip qtwebchannel \-skip qtscript \-skip qtwebengine \-skip qtwebview \-skip qtlocation \-skip qtremoteobjects \-skip qtpurchasing \-skip qtactiveqt \-skip qtwinextras \-skip qtx11extras \-skip qtmacextras \-skip qtandroidextras \-skip qtgamepad \-skip qt3d \-skip qtdatavis3d \-skip qtquick3d \-skip qtgraphicaleffects \-skip qtquickcontrols \-skip qtquickcontrols2 \-skip qtquicktimeline \-skip qtlottie \-skip qtsensors \-skip qtspeech \-skip qtdoc \-skip qtwebglpluginecho " configure 配置完成,請檢查是否有錯誤信息。"
echo "接下來可以執行 make -jN 進行編譯,例如:make -j$(nproc)"
編譯安裝
make -j$(nproc)
make install
內容如下
編譯參數說明:
# 查看所有參數以及使用方法
./configure -h # 進入到源碼根目錄(cd qt-everywhere-src-5.15.2),查看模塊名字
ls qt*/ | grep -E '^qt'
3.2 設置QCreator
/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++
4 說明
4.1 關于編譯器名字的區別
以gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu為例:
部分 | 含義 |
---|---|
gcc | GNU 編譯器套件(GNU Compiler Collection) |
linaro | Linaro 組織維護的版本,專為 ARM 平臺優化 |
7.5.0 | GCC 的主版本號,是 gcc 7 系列,支持 C++11 |
2019.12 | 工具鏈構建的版本時間(2019年12月發布) |
x86_64 | 構建主機架構(host),即你用這個工具鏈的機器(通常是 x86_64 架構的 PC) |
aarch64-linux-gnu | 目標架構(target),說明這套工具鏈是用來生成 aarch64(ARM64)Linux 程序的 |
- aarch64-linux-gnu
是目標系統(Target triple)的三個部分:
部分 | 說明 |
---|---|
aarch64 | 目標 CPU 架構(ARMv8,64 位) |
linux | 目標操作系統 |
gnu | 使用的是 glibc 運行時(不是 uClibc 或 musl) |
你在官網可能開看到了以下諸多編譯器名字,又有什么區別:
aarch64-elf
aarch64-linux-gnu
aarch64_be-elf
aarch64_be-linux-gnu
arm-eabi
arm-linux-gnueabi
arm-linux-gnueabihf
armeb-eabi
armeb-linux-gnueabi
armeb-linux-gnueabihf
armv8l-linux-gnueabihf
名稱 | 架構 | OS | C庫 | 浮點支持 | 字節序 | 用途 |
---|---|---|---|---|---|---|
aarch64-elf | ARM64 | 裸機 | 無 | - | 小端 | 裸機開發、bootloader |
aarch64-linux-gnu | ARM64 | Linux | glibc | 支持 | 小端 | 主流 編譯架構 |
aarch64_be-linux-gnu | ARM64 | Linux | glibc | 支持 | 大端 | 非常少見 |
arm-linux-gnueabi | ARM32 | Linux | glibc | soft-float | 小端 | 較老系統,性能差 |
arm-linux-gnueabihf | ARM32 | Linux | glibc | 硬浮點 | 小端 | Raspberry Pi、嵌入式主流 |
arm-eabi | ARM32 | 裸機 | newlib | 無 | 小端 | MCU開發(如 STM32) |
armeb-linux-gnueabihf | ARM32 | Linux | glibc | 硬浮點 | 大端 | 很少用 |
armv8l-linux-gnueabihf | ARMv8 (32位) | Linux | glibc | 硬浮點 | 小端 | Raspberry Pi(32位系統) |
4.2 如果 mkspecs 目錄中沒有你用的編譯器怎么辦?
假設你正在用的是 csky-abiv2-ux-linuxv3615 工具鏈,而 mkspecs/ linux-csky-ux-g++不存在怎么辦?你可以手動創建它:
- 第一步:準備交叉工具鏈路徑(假設)
/usr/local/arm/csky-abiv2-ux-linuxv3615/
├── bin/
│ ├── csky-linux-uclibcabiv2-gcc
│ ├── csky-linux-uclibcabiv2-g++
│ ├── csky-linux-uclibcabiv2-ar
│ └── ...
├── libc/
├── include/
└── ...
- 第二步:創建 Qt 的 mkspec 平臺目錄
cd ~/qt_src/qt-everywhere-src-5.15.2/qtbase/mkspecs
cp -r linux-arm-gnueabi-g++ linux-csky-ux-g++
如果沒有 linux-arm-gnueabi-g++,可以復制任意近似平臺的 mkspec,例如 linux-g++,然后改名。
- 第三步:編輯 linux-csky-ux-g++/qmake.conf
用你實際的編譯器前綴(如 csky-linux-uclibcabiv2-)修改內容如下:
# qmake configuration for building with csky-linux-uclibcabiv2-g++MAKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublibinclude(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)# 交叉編譯器
QMAKE_CC = csky-linux-uclibcabiv2-gcc
QMAKE_CXX = csky-linux-uclibcabiv2-g++
QMAKE_LINK = csky-linux-uclibcabiv2-g++
QMAKE_LINK_SHLIB = csky-linux-uclibcabiv2-g++# 工具鏈工具
QMAKE_AR = csky-linux-uclibcabiv2-ar cqs
QMAKE_OBJCOPY = csky-linux-uclibcabiv2-objcopy
QMAKE_NM = csky-linux-uclibcabiv2-nm -P
QMAKE_STRIP = csky-linux-uclibcabiv2-stripload(qt_config)
- 第四步:配置 Qt 的 configure 腳本時使用它
你的配置腳本中的平臺參數應修改為:
-xplatform linux-csky-ux-g++
環境變量也對應的修改
4.3 QT各個模塊的作用
按需選擇編譯
模塊名 | 功能說明 | 是否建議保留 |
---|---|---|
qtbase | Qt 的核心模塊,包含 QtCore、QtGui、QtWidgets | ?必須保留 |
qtdeclarative | QML 與 QtQuick 引擎支持 | ??可選 |
qttools | Qt 工具鏈(如 lupdate, designer 等) | ??可選 |
qtserialport | 串口支持 | ??可選 |
qtsvg | SVG 圖像支持 | ??可選 |
qtmultimedia | 音視頻播放、攝像頭等 | ??可選 |
qtcharts | 圖表控件 | ??可選 |
qtnetworkauth | OAuth 授權支持 | ?可跳過 |
qtconnectivity | 藍牙、NFC 等 | ?可跳過 |
qtserialbus | CAN、Modbus 等總線通信支持 | ??可選 |
qtwebsockets | WebSocket 通信支持 | ??可選 |
qtwebchannel | Web 與 Qt 通信橋接(QWebChannel) | ??可選 |
qtimageformats | 額外圖像格式支持,如 tiff/webp/mng | ??可選 |
qtxmlpatterns | XML/XPath/XQuery 處理 | ?可跳過 |
qtscxml | 狀態機 XML 支持 | ?可跳過 |
qtscript | QtScript 支持(已廢棄) | ?強烈建議跳過 |
qtwebengine | Chromium 內核瀏覽器支持,依賴重 | ?建議跳過 |
qtwebview | 嵌入瀏覽器控件 | ?建議跳過 |
qtlocation | 地圖與定位服務 | ?可跳過 |
qtremoteobjects | 分布式對象(遠程調用) | ?可跳過 |
qtpurchasing | 應用內購買支持 | ?可跳過 |
qtactiveqt | 與 ActiveX 交互,僅用于 Windows | ?可跳過 |
qtwinextras | Windows 特有控件與特性支持 | ?可跳過 |
qtx11extras | X11 特性封裝,適用于 X11 環境 | ?可跳過 |
qtmacextras | macOS 特性封裝 | ?可跳過 |
qtandroidextras | Android 平臺特性支持 | ?可跳過 |
qtgamepad | 游戲手柄支持 | ?可跳過 |
qt3d | 3D 圖形支持 | ?可跳過 |
qtdatavis3d | 三維數據圖表 | ?可跳過 |
qtquick3d | Qt Quick 3D 模塊 | ?可跳過 |
qtvirtualkeyboard | 虛擬鍵盤(觸摸屏鍵盤) | ??可選 |
qtgraphicaleffects | QML 圖形特效模塊 | ??可選 |
qtquickcontrols / qtquickcontrols2 | QML 控件 | ??可選 |
qtquicktimeline | 時間軸動畫控制模塊 | ??可選 |
qtlottie | 播放 Lottie 動畫 JSON | ??可選 |
qtsensors | 傳感器支持 | ?可跳過 |
qtspeech | 文本轉語音支持 | ?可跳過 |
qtdoc | Qt 文檔模塊,不影響功能 | ?建議跳過 |
qttranslations | 多語言翻譯文件 | ?建議跳過 |
qtwebglplugin | WebGL 插件(瀏覽器用) | ?建議跳過 |