Qt 5.15 嵌入式 ARM 交叉编译(Ubuntu 20.04)已验证可用参数全集

核心说明

  • 适用场景:Ubuntu 20.04 主机 + GCC 8.3 交叉编译链(arm-linux-gnueabihf-)+ Qt 5.15.x 源码 + 嵌入式 ARMv8-a或v7 设备(帧缓冲 linuxfb 显示)。
  • 核心原则:禁用嵌入式非必需功能 / 模块,使用 Qt 内置库减少系统依赖,避免交叉编译环境缺失库报错。
  • 所有参数均经过实际报错验证,无 “未知参数”“依赖缺失” 等问题。

    完整可用配置参数清单(按功能分类)

    1. 基础编译模式配置

    参数作用说明
    -verbose输出详细配置日志(便于排查报错)
    -release编译 Release 版本(优化代码,无调试信息,适合嵌入式部署)
    -opensource使用 Qt 开源版本
    -confirm-license自动确认开源许可证(无需手动交互)
    -make libs仅编译核心库(不编译工具、示例、测试用例,减少编译体积和时间)
    -optimized-qmake优化 qmake 工具(提升后续项目构建效率)
    -prefix $INSTALL指定安装路径($INSTALL 为自定义目录,如 ./install

    2. 内置库启用(避免系统依赖)

    参数作用说明
    -qt-libjpeg使用 Qt 内置 JPEG 库(无需交叉编译环境的 libjpeg
    -qt-libpng使用 Qt 内置 PNG 库(无需交叉编译环境的 libpng
    -qt-freetype使用 Qt 内置 Freetype 字体库(替代系统 freetype,嵌入式常用)

    3. 禁用非必需功能(解决依赖报错)

    参数作用说明对应报错场景
    -no-fontconfig禁用 Fontconfig 字体配置(嵌入式无此库,用内置 Freetype 替代)找不到 fontconfig.hlibfontconfig.so
    -no-opengl禁用 OpenGL(嵌入式设备通常无硬件 OpenGL 支持)找不到 GL/gl.h 等 OpenGL 头文件
    -no-xcb禁用 XCB 显示后端(嵌入式不用 X Window 系统)找不到 XCB 相关库(如 libxcb.so
    -no-d3d12禁用 Direct3D 12(Windows 平台功能,Linux 交叉编译无需)无实际报错,仅清理冗余检测
    -no-eglfs禁用 EGLFS 显示后端(仅用 linuxfb 即可)找不到 EGL 相关库
    -no-kms禁用 KMS(内核模式设置,嵌入式 linuxfb 无需)无实际报错,仅清理冗余检测
    -no-win32禁用 Win32 API 支持(Linux 交叉编译无需)找不到 windows.hntddmodm 检测报错)
    -no-feature-windows禁用 Windows 平台专属功能(彻底屏蔽 Windows 相关检测)找不到 windows.hntddmodm 检测报错)
    -no-feature-speechd禁用 Speechd 语音合成功能(Qt 5.15 专属禁用参数)找不到 libspeechd.h
    -no-zstd禁用 ZSTD 压缩功能(嵌入式用不到高压缩比场景)找不到 zstd.hlibzstd.so
    -no-sql-tds禁用 TDS 数据库连接(用于 SQL Server,嵌入式不用)找不到 sybfront.hfreetds 库头文件)

    4. 显示后端配置(嵌入式专用)

    参数作用说明
    -qpa linuxfb使用 Linux 帧缓冲(linuxfb)作为显示后端(嵌入式设备核心显示方式)

    5. 跳过无用模块(减少编译时间和体积)

    参数作用说明对应模块功能
    -skip qtspeech跳过语音模块(与 no-feature-speechd 双重保障)语音合成相关
    -skip qtwinextras跳过 Windows 额外功能模块(彻底解决 windows.h 报错)Windows 平台专属功能
    -skip qtwebengine跳过 WebEngine 模块(重量级网页渲染,嵌入式用不到)依赖 Chromium 源码,编译复杂且体积大
    -skip qtquick3d跳过 3D 渲染模块(嵌入式无 3D 需求)3D 图形相关
    -skip qtmultimedia跳过多媒体模块(音频 / 视频播放,嵌入式通常用专用库)依赖 alsa 等音频库,易报错
    -skip qtconnectivity跳过连接性模块(蓝牙、NFC 等,嵌入式用不到)蓝牙 / NFC 相关依赖检测
    -skip qtlocation跳过定位模块(GPS / 地图,嵌入式无此需求)定位服务相关依赖
    -skip qtgamepad跳过游戏手柄模块(嵌入式不用)游戏手柄硬件支持检测
    -skip qtx11extras跳过 X11 额外功能模块(嵌入式不用 X Window)X11 相关依赖
    -skip qtnetworkauth跳过网络认证模块(OAuth 等,嵌入式用不到)网络认证相关依赖
    -skip qt3d跳过 Qt 3D 模块(嵌入式无 3D 需求)3D 渲染相关依赖
    -skip qtwayland跳过 Wayland 显示服务器模块(嵌入式用 linuxfb 足够)Wayland 相关库依赖检测

    6. 链接器配置(解决动态库依赖)

    参数作用说明
    -L/usr/lib/aarch64-linux-gnu指定交叉编译环境的库路径(根据实际工具链路径调整)
    QMAKE_LIBS="-ldl -lrt"链接系统必要库(-ldl 动态链接库支持,-lrt 实时时钟支持)

    配置验证脚本

  • #!/bin/sh
    CURR_DIR=$(pwd)
    export INSTALL=$CURR_DIR/install
    
    echo "===== 快速验证:Qt 交叉编译配置是否正确(不执行编译) ====="
    echo "===== 步骤1:清理残留 + 正确锁定所有无用测试 ====="
    rm -rf config.cache
    # 所有需要锁定的测试目录(覆盖所有报错场景)
    test_dirs="ntddmodm gssapi intelcet x86_simd"
    for test_dir in $test_dirs; do
        # 先删除所有旧的文件/目录(避免残留冲突)
        rm -rf config.tests/$test_dir
        rm -rf qtbase/config.tests/$test_dir
        # 关键修复:创建空目录占位(而非文件),避免父目录创建失败
        mkdir -p config.tests/$test_dir
        mkdir -p qtbase/config.tests/$test_dir
        # 在空目录中创建占位文件,阻止 Qt 写入测试文件
        touch config.tests/$test_dir/.locked
        touch qtbase/config.tests/$test_dir/.locked
        echo "✅ 已锁定测试目录:$test_dir"
    done
    
    echo "===== 步骤2:执行 configure 配置(禁用 DBus,参数不变) ====="
    ./configure -verbose \
    -release \
    -opensource \
    -confirm-license \
    -make libs \
    -optimized-qmake \
    -qt-libjpeg \
    -qt-libpng \
    -qt-freetype \
    -no-fontconfig \
    -xplatform linux-arm-gnueabihf-g++ \
    -prefix $INSTALL \
    -nomake examples \
    -nomake tests \
    -no-opengl \
    -silent \
    -qpa linuxfb \
    -no-xcb \
    -no-eglfs \
    -no-kms \
    -no-zstd \
    -no-sql-tds \
    -no-dbus \
    -skip qtspeech \
    -skip qtwinextras \
    -skip qtwebengine \
    -skip qtquick3d \
    -skip qtmultimedia \
    -skip qtconnectivity \
    -skip qtlocation \
    -skip qtgamepad \
    -skip qtx11extras \
    -skip qtnetworkauth \
    -skip qt3d \
    -skip qtwayland \
    -skip qtscript \
    -skip qtdeclarative \
    -L/usr/lib/aarch64-linux-gnu \
    QMAKE_LIBS="-ldl -lrt"
    
    # 验证配置结果
    if [ $? -eq 0 ]; then
        echo "========================================"
        echo "✅ 配置验证成功!所有参数有效,测试/依赖均已处理"
        echo "✅ 已适配 ARMv8-a 架构,禁用所有嵌入式无用功能"
        echo "✅ 编译命令:make -j$(nproc) && make install"
        echo "========================================"
    else
        echo "========================================"
        echo "❌ 配置验证失败!请查看上方报错信息"
        echo "❌ 若仍有目录创建失败,删除对应 .locked 文件后重试"
        echo "========================================"
        exit 1
    fi
    

  • 最终可直接运行的 build.sh 脚本

    #!/bin/sh
    CURR_DIR=$(pwd)
    export INSTALL=$CURR_DIR/install
    export NPROC=$(nproc)  # 即使1核也正常执行
    
    echo "========================================"
    echo "🚀 Qt 5.15.15 ARMv8-a 交叉编译安装脚本"
    echo "========================================"
    echo "编译目录:$CURR_DIR"
    echo "安装目录:$INSTALL"
    echo "CPU 核心数:$NPROC(编译线程数)"
    echo "========================================"
    
    # 步骤1:清理残留 + 锁定无用测试目录(容错处理,失败不退出)
    echo ""
    echo "[1/4] 清理残留文件 + 锁定无效测试目录..."
    # 清理命令添加 || true,即使无残留也不退出
    rm -rf config.cache $INSTALL obj/ lib/ || true
    find . -name "*.o" -delete || true
    find . -name "*.so" -delete || true
    find . -name "*.so.*" -delete || true
    find . -name "Makefile" -delete || true
    make distclean 2>/dev/null || true  # 无残留时忽略错误
    
    # 锁定所有无效测试目录(确保命令执行成功)
    test_dirs="ntddmodm gssapi intelcet x86_simd"
    for test_dir in $test_dirs; do
        rm -rf config.tests/$test_dir qtbase/config.tests/$test_dir || true
        mkdir -p config.tests/$test_dir qtbase/config.tests/$test_dir || true
        touch config.tests/$test_dir/.locked qtbase/config.tests/$test_dir/.locked || true
        echo "✅ 已锁定测试目录:$test_dir"
    done
    echo "[1/4] 清理+锁定完成!"
    
    # 步骤2:执行 configure 配置
    echo ""
    echo "[2/4] 执行 Qt 配置(仅验证参数,不编译)..."
    ./configure -verbose \
    -release \
    -opensource \
    -confirm-license \
    -make libs \
    -optimized-qmake \
    -qt-libjpeg \
    -qt-libpng \
    -qt-freetype \
    -no-fontconfig \
    -xplatform linux-arm-gnueabihf-g++ \
    -prefix $INSTALL \
    -nomake examples \
    -nomake tests \
    -no-opengl \
    -silent \
    -qpa linuxfb \
    -no-xcb \
    -no-eglfs \
    -no-kms \
    -no-zstd \
    -no-sql-tds \
    -no-dbus \
    -skip qtspeech \
    -skip qtwinextras \
    -skip qtwebengine \
    -skip qtquick3d \
    -skip qtmultimedia \
    -skip qtconnectivity \
    -skip qtlocation \
    -skip qtgamepad \
    -skip qtx11extras \
    -skip qtnetworkauth \
    -skip qt3d \
    -skip qtwayland \
    -skip qtscript \
    -skip qtdeclarative \
    -L/usr/lib/aarch64-linux-gnu \
    QMAKE_LIBS="-ldl -lrt"
    
    # 检查配置是否成功,失败则提示退出
    if [ $? -eq 0 ]; then
        echo "[2/4] 配置成功!开始编译..."
    else
        echo "[2/4] 配置失败!请查看上方报错信息"
        exit 1
    fi
    
    # 步骤3:多线程编译(1核也正常执行,无需修改)
    echo ""
    echo "[3/4] 开始编译(线程数:$NPROC)..."
    make -j$NPROC
    
    if [ $? -eq 0 ]; then
        echo "[3/4] 编译成功!开始安装..."
    else
        echo "[3/4] 编译失败!请查看上方报错信息"
        exit 1
    fi
    
    # 步骤4:安装到指定目录
    echo ""
    echo "[4/4] 安装 Qt 到 $INSTALL..."
    make install
    
    # 安装完成后验证
    if [ -f "$INSTALL/bin/qmake" ] && [ -d "$INSTALL/lib" ]; then
        echo ""
        echo "========================================"
        echo "🎉 Qt 5.15.15 交叉编译安装完成!"
        echo "========================================"
        echo "📁 安装路径:$INSTALL"
        echo "🔧 关键文件:"
        echo "  - qmake:$INSTALL/bin/qmake"
        echo "  - 库文件:$INSTALL/lib"
        echo "  - 头文件:$INSTALL/include"
        echo "========================================"
        echo "💡 嵌入式部署说明:"
        echo "  1. 将 $INSTALL/lib 下的所有 .so 文件拷贝到 ARM 设备的 /usr/lib 目录"
        echo "  2. 将 $INSTALL/plugins 拷贝到 ARM 设备的 /usr/lib/qt5/plugins"
        echo "  3. 编译应用时指定 qmake 路径:$INSTALL/bin/qmake"
        echo "========================================"
    else
        echo ""
        echo "❌ 安装验证失败!未找到关键文件,请查看安装日志..."
        exit 1
    fi
    
    

    使用说明

  • 脚本权限:保存后执行 chmod +x build.sh 赋予执行权限。
  • 路径调整:若交叉编译链的库路径不是 /usr/lib/aarch64-linux-gnu,需修改 -L 参数后的路径。
  • 编译执行:配置成功后,解除 makemake install 的注释,重新运行脚本即可。
  • 这份清单已覆盖你遇到的所有报错场景,后续交叉编译 Qt 5.15 可直接复用,无需重复踩参数和依赖的坑!
  • 后续报错:若仍有新的依赖报错,可参考 “禁用非必需功能”“跳过无用模块” 的思路,新增对应参数(如 -no-xxx-skip qtxxx)。
<think>我们正在为Qt 5.15.2配置交叉编译环境,目标平台是aarch64架构(如ARM64的嵌入式设备),使用的交叉编译器是aarch64-linux-gnu-gcc 9.4.0。需要配置的模块包括MQTT、HTTP和OpenSSL。 步骤概述: 1. 确保交叉编译器已正确安装并配置环境变量。 2. 交叉编译OpenSSL库(因为MQTT和HTTP可能需要SSL支持)。 3. 配置Qt源码,使其支持交叉编译,并指定OpenSSL的位置。 4. 配置MQTT和HTTP模块(HTTP模块在Qt中通常通过QNetworkAccessManager实现,但可能需要SSL支持;MQTT需要单独编译QtMqtt模块)。 详细步骤: 第一步:安装交叉编译器和相关工具 在Ubuntu 20.04上安装aarch64-linux-gnu-gcc 9.4.0: ``` sudo apt update sudo apt install gcc-9-aarch64-linux-gnu g++-9-aarch64-linux-gnu ``` 安装完成后,可以通过以下命令检查版本: ``` aarch64-linux-gnu-gcc-9 --version ``` 如果系统中同时存在多个版本的gcc,可以通过update-alternatives来设置默认版本,或者直接使用带版本号的命令。但为了简便,我们假设使用aarch64-linux-gnu-gcc-9和aarch64-linux-gnu-g++-9。 第二步:交叉编译OpenSSL 下载OpenSSL源码(例如1.1.1版本,因为Qt5.15.2通常使用这个版本): ``` wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz tar -xvf openssl-1.1.1k.tar.gz cd openssl-1.1.1k ``` 配置OpenSSL,注意设置交叉编译器和目标平台: ``` ./Configure linux-aarch64 --prefix=$PWD/install_dir --cross-compile-prefix=aarch64-linux-gnu- no-shared ``` 这里: - linux-aarch64:目标平台。 --prefix:指定安装目录(这里设置为当前目录下的install_dir)。 --cross-compile-prefix:指定交叉编译器前缀(aarch64-linux-gnu-)。 no-shared:只编译静态库(如果需要共享库,可以去掉,但交叉编译环境下通常静态库更方便)。 然后编译并安装: ``` make && make install ``` 编译完成后,在install_dir目录下会有include、lib等目录,这就是我们需要的OpenSSL交叉编译版本。 第三步:获取Qt源码并配置 1. 下载Qt 5.15.2源码: https://download.qt.io/archive/qt/5.15/5.15.2/single/qt-everywhere-src-5.15.2.tar.xz 2. 解压源码: ``` tar -xvf qt-everywhere-src-5.15.2.tar.xz cd qt-everywhere-src-5.15.2 ``` 3. 配置交叉编译环境,创建一个脚本(例如configure.sh)来运行configure: ``` #!/bin/bash # 设置交叉编译工具链 export TOOLCHAIN_PREFIX=aarch64-linux-gnu- export CC=${TOOLCHAIN_PREFIX}gcc-9 export CXX=${TOOLCHAIN_PREFIX}g++-9 # OpenSSL的安装目录(第二步中编译的) export OPENSSL_ROOT_DIR=/path/to/openssl-1.1.1k/install_dir # 创建构建目录(建议在源码目录外) mkdir -p build && cd build ../configure -prefix /path/to/qt5.15.2-arm64-install \ -opensource -confirm-license \ -release -shared \ -xplatform linux-aarch64-gnu-g++ \ -no-opengl \ -no-xcb \ -no-gtk \ -openssl-linked \ -I $OPENSSL_ROOT_DIR/include \ -L $OPENSSL_ROOT_DIR/lib \ -ssl \ -nomake examples -nomake tests ``` 注意:这里我们使用了`-xplatform`指定目标平台为linux-aarch64-gnu-g++,但Qt源码中可能没有这个平台的文件,因此我们需要创建一个。 在`qtbase/mkspecs`目录下创建`linux-aarch64-gnu-g++`目录,并创建两个文件: - qmake.conf: ``` # # qmake configuration for aarch64-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) # modifications to g++.conf QMAKE_CC = aarch64-linux-gnu-gcc-9 QMAKE_CXX = aarch64-linux-gnu-g++-9 QMAKE_LINK = aarch64-linux-gnu-g++-9 QMAKE_LINK_SHLIB = aarch64-linux-gnu-g++-9 # 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 load(qt_config) ``` - qplatformdefs.h:这个文件可以从`linux-g++`目录下复制过来,然后根据需要进行修改(通常不需要修改)。 第四步:编译QtMqtt模块 在Qt 5.15.2中,MQTT模块是一个额外的模块,位于`qtmqtt`目录下。我们需要单独编译这个模块,因为默认配置可能不会自动包含它。 在完成上述Qt基础配置后,我们可以先编译Qt基础模块,然后再编译MQTT模块。 1. 在构建目录中运行配置脚本(上面的configure.sh),然后执行: ``` make -j$(nproc) make install ``` 这样会安装Qt基础库到指定的安装目录。 2. 编译QtMqtt模块: ``` cd ../qtmqtt # 使用安装的Qt交叉编译工具链来编译 /path/to/qt5.15.2-arm64-install/bin/qmake make -j$(nproc) make install ``` 这样MQTT模块就会被安装到Qt的安装目录中。 关于HTTP:在Qt中,HTTP功能是通过QtNetwork模块实现的,而我们在配置基础Qt时已经包含了QtNetwork(因为使用了-ssl选项,所以会包含网络和SSL)。因此,只要正确链接了OpenSSL,HTTP应该就可以使用。 第五步:在Qt项目中使用 在交叉编译Qt项目时,使用安装好的交叉编译Qt,并指定平台为linux-aarch64-gnu-g++。 注意:在开发主机上,需要将交叉编译Qt安装路径下的bin目录添加到PATH,然后使用qmake来生成Makefile。 例如: ``` export PATH=/path/to/qt5.15.2-arm64-install/bin:$PATH qmake -spec linux-aarch64-gnu-g++ CONFIG+=release make ``` 这样生成的可执行文件就是ARM64架构的,可以放到目标板上运行。 问题与注意事项: - OpenSSL的版本需要与目标系统兼容,如果目标系统有特定版本的OpenSSL,最好使用相同版本编译。 - 如果目标系统有共享库,需要将Qt和OpenSSL的共享库部署到目标系统。 - 如果遇到SSL相关错误,检查Qt配置时OpenSSL的路径是否正确,以及是否成功链接。 通过以上步骤,应该能够成功配置Qt 5.15.2的交叉编译环境,并支持MQTT、HTTP和OpenSSL。 生成相关问题: 1. 如何验证交叉编译Qt程序在目标板上运行? 2. 交叉编译Qt时如何减少体积? 3. 交叉编译OpenSSL时遇到问题如何解决? 4. 如何为Qt交叉编译添加其他模块(如数据库模块)?</think>### 在 Ubuntu 20.04 上为 Qt 5.15.2 配置 AArch64 交叉编译环境(含 MQTT/HTTP/OpenSSL) #### 1. **安装交叉编译工具链** ```bash sudo apt update sudo apt install gcc-9-aarch64-linux-gnu g++-9-aarch64-linux-gnu \ binutils-aarch64-linux-gnu libssl-dev ``` 验证安装: ```bash aarch64-linux-gnu-gcc-9 --version # 应显示 9.4.0 ``` #### 2. **交叉编译 OpenSSL 1.1.1** ```bash wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz tar -xvf openssl-1.1.1w.tar.gz cd openssl-1.1.1w ./Configure linux-aarch64 \ --prefix=$PWD/install \ --cross-compile-prefix=aarch64-linux-gnu- \ no-shared make && make install ``` > 关键参数: > `--cross-compile-prefix` 指定编译器前缀[^1] > `no-shared` 生成静态库(Qt 交叉编译推荐) #### 3. **配置 Qt 源码** ```bash tar -xvf qt-everywhere-src-5.15.2.tar.xz cd qt-everywhere-src-5.15.2 # 创建平台描述文件 qtbase/mkspecs/linux-aarch64-gnu-g++/qmake.conf: MAKEFILE_GENERATOR = UNIX QMAKE_CC = aarch64-linux-gnu-gcc-9 QMAKE_CXX = aarch64-linux-gnu-g++-9 QMAKE_LINK = aarch64-linux-gnu-g++-9 QMAKE_AR = aarch64-linux-gnu-ar cqs ``` #### 4. **编译 Qt 基础库** ```bash ./configure -prefix /opt/qt5.15.2-arm64 \ -xplatform linux-aarch64-gnu-g++ \ -opensource -confirm-license \ -openssl-linked \ -I /path/to/openssl-1.1.1w/install/include \ -L /path/to/openssl-1.1.1w/install/lib \ -nomake examples -nomake tests make -j$(nproc) sudo make install ``` #### 5. **启用 MQTT 和 HTTP 模块** ```bash # 编译 MQTT 模块 cd qtmqtt /opt/qt5.15.2-arm64/bin/qmake make && sudo make install # HTTP 功能已在 QtNetwork 模块中自动启用 ``` #### 6. **验证配置** 创建测试文件 `test.pro`: ```qmake QT += core network mqtt TARGET = test SOURCES += main.cpp ``` 编译验证: ```bash /opt/qt5.15.2-arm64/bin/qmake -spec linux-aarch64-gnu-g++ make file test # 应显示 ELF 64-bit LSB ARM aarch64 ``` ### 关键问题解决方案 1. **OpenSSL 链接错误** 确保在 `.pro` 文件中添加: ```qmake LIBS += -L/path/to/openssl/lib -lssl -lcrypto INCLUDEPATH += /path/to/openssl/include ``` 2. **MQTT 模块缺失** 手动编译 qtmqtt 模块后,确认安装路径包含: ``` /opt/qt5.15.2-arm64/lib/libQt5Mqtt.so ``` 3. **HTTP 证书验证** 部署根证书到目标设备: ```bash sudo cp /etc/ssl/certs/ca-certificates.crt /target/root/path ``` ### 环境变量配置 在 `~/.bashrc` 中添加: ```bash export PATH=/opt/qt5.15.2-arm64/bin:$PATH export CROSS_COMPILE=aarch64-linux-gnu- ``` > **交叉编译验证**: > 使用 `aarch64-linux-gnu-objdump -d test | grep NEEDED` 检查动态库依赖[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值