核心说明
- 适用场景: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.h或libfontconfig.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.h(ntddmodm检测报错)-no-feature-windows禁用 Windows 平台专属功能(彻底屏蔽 Windows 相关检测) 找不到 windows.h(ntddmodm检测报错)-no-feature-speechd禁用 Speechd 语音合成功能(Qt 5.15 专属禁用参数) 找不到 libspeechd.h-no-zstd禁用 ZSTD 压缩功能(嵌入式用不到高压缩比场景) 找不到 zstd.h或libzstd.so-no-sql-tds禁用 TDS 数据库连接(用于 SQL Server,嵌入式不用) 找不到 sybfront.h(freetds库头文件)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参数后的路径。 - 编译执行:配置成功后,解除
make和make install的注释,重新运行脚本即可。 - 这份清单已覆盖你遇到的所有报错场景,后续交叉编译 Qt 5.15 可直接复用,无需重复踩参数和依赖的坑!
- 后续报错:若仍有新的依赖报错,可参考 “禁用非必需功能”“跳过无用模块” 的思路,新增对应参数(如
-no-xxx或-skip qtxxx)。
3446

被折叠的 条评论
为什么被折叠?



