尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

QT交叉编译

QT交叉编译 摘要本文总结了在 UbuntuLinux x86_64主机上交叉编译 Qt5.12.3 到 aarch64-linux-gnuARM64平台的完整步骤涵盖环境准备、工具链校验、源码下载、影子编译目录创建、mkspec 修改、configure 配置、编译安装与成果验证并补充了 Windows 本地交叉编译的流程说明帮助读者在 Linux 或 Windows 上构建可直接用于 ARM64 开发板的 Qt 套件。UbuntuLinux x86_64编译 Qt5.12.3 目标 aarch64-linux-gnu 完整步骤总结用途Linux 主机编译产出Linux 版 qmake/moc ARM64 的 .so 库可本地 Linux 编译 ARM 程序也可给 Windows QtCreator 做 SSH 远程编译复用这套 Qt1、环境准备安装依赖包sudo apt update sudo apt install build-essential git perl bison flex python2 sudo apt install aarch64-linux-gnu-gcc aarch64-linux-gnu-g2、校验工具链aarch64-linux-gnu-g -v perl -v flex --version bison --version3、源码准备https://download.qt.io/new_archive/qt/5.12/5.12.3/single/4、新建独立构建目录影子编译新建最终安装目录创建一个空目录build-qt512-arm645、修改 mkspec适配交叉编译器修改qt-everywhere-src-5.12.3/qtbase/mkspecs/linux-aarch64-gnu-g/qmake.conf确认编译器前缀aarch64-linux-gnu-# # qmake configuration for building with 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 QMAKE_CXX aarch64-linux-gnu-g QMAKE_LINK aarch64-linux-gnu-g QMAKE_LINK_SHLIB aarch64-linux-gnu-g 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) ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ qt-everywhere-src-5.12.3/qtbase/mkspecs/linux-aarch64-gnu-g/qmake.conf 24L, 742B6、configure 配置示例最小编译关闭冗余组件进入build-qt512-arm64目录然后执行下面命令注意这条是qtbase/configure仅编译 QtBase不是全套 qt-everywhere而且缺少启用 qtwebsockets这就是为什么你套件没有 websockets 模块路径../qt-everywhere-src-5.12.3/qtbase/configure → 只编译 qtbase 基础模块core、gui、network 等qtwebsockets 属于独立子模块不在 qtbase 里面# 进入构建目录 ../qt-everywhere-src-5.12.3/qtbase/configure \ -release -opensource -confirm-license \ -prefix /home/linjl/Qt5.12.3-ARM64 \ -nomake tests -nomake examples \ -no-opengl -no-iconv -no-dbus -no-openssl \ -skip qtvirtualkeyboard -skip qtwebengine -skip qtscript \ -skip qtdeclarative -skip qtwayland -skip qt3d \ -platform linux-g -xplatform linux-aarch64-gnu-g \ QMAKE_CXXFLAGS-Wno-free-nonheap-object -Wno-deprecated-copy -Wno-error逐行参数解释../qt-everywhere-src-5.12.3/qtbase/configure调用qtbase 子目录的配置脚本仅配置 Qt 基础核心库QtCore, QtNetwork, QtGui 等❗ 重点qtwebsockets、qtserialport 这类模块不属于 qtbase只用这个脚本编译不会构建 websockets-release编译 Release 版本不带调试符号用于产品运行-opensource -confirm-license使用 Qt 开源协议自动确认许可不用手动交互-prefix /home/linjl/Qt5.12.3-ARM64安装路径make install后所有头文件、库、qmake 会安装到此目录-nomake tests -nomake examples不编译自带测试程序、官方示例工程节约编译时间与磁盘空间-no-opengl -no-iconv -no-dbus -no-openssl-no-opengl禁用 OpenGL 图形渲染无 GUI / 不需要 GPU 渲染可关闭-no-iconv禁用 iconv 编码库解决之前 iconv 编译报错-no-dbus禁用 DBus 进程间通信-no-openssl禁用 OpenSSL 加密网络 SSL/TLS 会受限-skip qtvirtualkeyboard -skip qtwebengine -skip qtscript -skip qtdeclarative -skip qtwayland -skip qt3d跳过编译这些子模块不参与构建节省时间⚠️ 这里没有 skip qtwebsockets但问题根源你调用的是qtbase/configure只会编译 qtbase其它子模块默认不会编译-platform linux-g宿主机Ubuntu x86_64编译工具本机 gcc/g用于编译 qmake 等主机工具-xplatform linux-aarch64-gnu-g目标平台交叉编译产出 aarch64 (ARM64) Linux 程序读取mkspecs/linux-aarch64-gnu-g配置交叉编译器QMAKE_CXXFLAGS-Wno-free-nonheap-object -Wno-deprecated-copy -Wno-error给交叉编译器 g 追加编译参数-Wno-free-nonheap-object关闭 “释放非堆内存” 警告-Wno-deprecated-copy关闭废弃拷贝构造相关警告-Wno-error警告不升级为错误遇到兼容警告不会直接中断编译适配高版本 GCC如果执行有类似下面的错误进入对应文件generator.cpp在上面添加#include limits然后删除build-qt512-arm64目录重新创建一个在执行。这边删除是为了清除旧的。7、编译 安装make -j$(nproc) make install8、成果验证# 检查ARM库架构 file /home/linjl/Qt5.12.3-ARM64/lib/libQt5Core.so.5.12.3 # 输出ELF 64-bit LSB shared object, ARM aarch64 → 编译成功Qt5.12.3 aarch64 ARM64 交叉编译套件根目录/home/linjl/Qt5.12.3-ARM64lib/ 存放aarch64 ARM64 Linux 平台的 Qt 动态库 libQt5Core.so、libQt5Gui.so …9、使用创建一个build目录然后进入build目录执行。make编译出可执行文件后使用linuxdeployqt等工具打包后直接拷贝到目标服务器即可运行目标服务器无需下载qt等任何东西。/home/linjl/Qt5.12.3-ARM64/bin/qmake xxx.pro makeWindows 本地编译 Qt5.12.3aarch64-linux-gnu 交叉版完整步骤目标在 Windows 主机上编译出一套可直接给 Windows 版 Qt Creator 本地使用的 ARM64 交叉 Qt 套件下载 Qt 源码F:\lin-dev\work\Qt-cross-compile\qt-everywhere-src-5.12.3\qtbase\mkspecsQt 编译平台配置目录mkspec make specificationF:\lin-dev\work\Qt-cross-compile\qt-everywhere-src-5.12.3\qtbase\mkspecs\linux-aarch64-gnu-g这个是 Qt5.12.3官方自带的 AArch6464 位 ARMARM64RK3588、树莓派 4 64 位等 ARM Linux交叉编译 mkspec 模板内部包含两张文件1、qmake.conf✅【核心配置文件】定义编译器、编译 / 链接参数、标志# # qmake configuration for building with 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) 【核心】指定 AArch64 Linux 交叉工具链程序 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 归档、拷贝、符号、strip 工具 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 加载 Qt 内置配置末尾必须保留 load(qt_config)安装交叉编译器用于编译Qt源码生成可以在arm平台上面运行的库。gcc-arm-11.2-2022.02-mingw-w64-i686-aarch64-none-linux-gnu.zipgcc-arm-11.2-2022.02GCC 11.2 版本Arm 官方 2022.02 发布套件mingw-w64-i686主机运行环境Windows32 位 MinGW可在 64 位 Win10/11 兼容运行aarch64-none-linux-gnu目标架构AArch64ARM64 目标系统ARM64 Linuxglibc 标准库下载路径https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/downloads解压一下可以改个比较简短的名字然后添加到环境变量中F:\lin-dev\work\Qt-cross-compile\Qt5.12.12-ARMv8\bin安装关联软件ActiveState PerlWindows 原生没有预装 Perl编译完整 Qt 源码qt-everywhere-src必须安装 Strawberry PerlQt 源码编译流程中大量.plPerl 脚本syncqt.pl、代码自动生成、ICU、WebKit、部分通讯模块MQTT/OPC UA都依赖 Perl 解释器运行因为我们要编译qt源码所以需要这个Strawberry Perl for Windows - Releases双击strawberry-perl-5.36.3.1-64bit.msi进行安装验证安装结果安装python3编译 Qt 源码修改qmake.conf配置文件GCC 10/11 之后很多 GCC 警告默认升级成-Werror警告 编译错误Qt 5.12.3 是很老的版本官方最高适配 GCC 8源码写法不符合新版 GCC 的严格规范于是直接编译中断。mingw32-make本身只是构建工具报错不是 mingw32-make 引起的是 aarch64-none-linux-gnu-g你的交叉编译器抛出的编译错误。mingw32-make 的作用读取 configure 生成的 Makefile调用你的aarch64-none-linux-gnu-g 交叉编译器编译源码 mingw32-make ≠ 交叉编译器它只是调度工具。所以需要修改一下防止mingw32-make编译的时候报错。F:\lin-dev\work\Qt-cross-compile\qt-everywhere-src-5.12.3\qtbase\mkspecs\linux-aarch64-gnu-g\qmake.conf# # qmake configuration for building with aarch64-none-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-none-linux-gnu-gcc QMAKE_CXX aarch64-none-linux-gnu-g QMAKE_LINK aarch64-none-linux-gnu-g QMAKE_LINK_SHLIB aarch64-none-linux-gnu-g modifications to linux.conf QMAKE_AR aarch64-none-linux-gnu-ar cqs QMAKE_OBJCOPY aarch64-none-linux-gnu-objcopy QMAKE_NM aarch64-none-linux-gnu-nm -P QMAKE_STRIP aarch64-none-linux-gnu-strip load(qt_config) QMAKE_CXXFLAGS -fpermissive -Wno-class-memaccess -Wno-errorpermissive QMAKE_CFLAGS -fpermissiveQMAKE_CXXFLAGSC 编译器参数g /aarch64-none-linux-gnu-g用于编译.cpp .hppC 源码。-fpermissive放宽 C 语法把部分非法转换降为警告解决const char**报错-Wno-class-memaccess关闭 memcpy 拷贝类对象的检查告警QMAKE_CFLAGSC 编译器参数gcc /aarch64-none-linux-gnu-gcc只用于编译纯.cC 语言源码不作用于 cpp 文件。追加参数保留原有编译器配置新增参数运行configure生成构建规则因为我们需要再arm平台运行我们的程序所以我们需要编译Qt的源码好让我们写的程序可以运行在arm上面因为我们依赖于Qt的源码所以要编译Qt源码成可以在arm上面运行的库。进入下载的源码目录qt-everywhere-src-5.12.3在WindowsMSYS2/CMD下对 qt-everywhere-src-5.12.3 整套 Qt 源码进行【交叉编译配置】目标编译产出ARM64 (aarch64/ARMv8) Linux 平台版本的 Qt5.12.3 库后续用这套 ARM 版 Qt 库编译你的.proQt 程序放到 ARM64 Linux 开发板RK3588 等运行。1、创建目录2、进入目录打开Powershell../qt-everywhere-src-5.12.3/configure -release -opensource -confirm-license -prefix F:\lin-dev\work\Qt-cross-compile\Qt5.12.3-arm64 -nomake tests -nomake examples -no-opengl -skip qtvirtualkeyboard -linuxfb -platform win32-g -xplatform linux-aarch64-gnu-g.\configure.batWindows 专用配置脚本Linux 下是./configure用于检测编译环境、编译器、依赖库生成构建规则。⚠️ 注意你的源码版本是5.12.3但 prefix 路径写了5.12.12版本号不一致属于笔误建议统一。-release编译Release 发行版本不带调试符号体积更小、运行更快与之对应-debug调试版嵌入式板子一般用 release。-opensource声明使用 Qt 开源协议GPL/LGPL搭配-confirm-license可以自动同意协议你这条命令缺少这个参数运行时会交互式确认许可证。-prefix D:\Qt\Qt5.12.12-ARMv8安装输出目录编译完成后执行make install所有 ARM 版 Qt 库、头文件、qmake、工具都会安装到这个文件夹。注意虽然是 Windows 路径但里面产出的是ARM Linux 平台的二进制库.so不能在 Windows 运行只能拷贝到 ARM 开发板-nomake tests/-nomake examples不编译 Qt 自带的测试程序、官方示例工程节省编译时间、减少最终库体积嵌入式交叉编译标配参数。-no-opengl禁用 OpenGL 支持。风险如果你的 Qt 程序用到 QOpenGLWidget、3D 绘图后续编译自己项目会报错仅纯 2D Widget、linuxfb 无 GPU 界面才适合关闭。-skip qtvirtualkeyboard跳过整个 qtvirtualkeyboard 模块不去编译这个软键盘组件减少编译耗时。-platform win32-g主机平台构建机环境当前你运行 configure 的系统是 Windows使用 Windows 上 MinGW 编译器用来编译 Qt 构建过程中需要的主机端工具moc、uic、rcc 等。原理交叉编译需要一套运行在 Windows 本地的工具链处理代码生成再用交叉编译器编译 ARM 平台库。-xplatform aarch64-linux-gnu-g✅【核心交叉参数】目标平台指定使用qtbase/mkspecs/aarch64-linux-gnu-g里的交叉编译规则也就是你之前修改的 qmake.conf告诉 Qt最终库要编译给 aarch64 (ARM64) Linux 系统。执行完后的结果执行mingw32-make进行编译读取 configure 生成的 Makefile调用qmake.conf中设置的编译器aarch64-none-linux-gnu-g 交叉编译器编译源码执行mingw32-make install输出结果F:\lin-dev\work\Qt-cross-compile\qt-everywhere-src-5.12.3\configure.bat ^ -platform win32-g ^ -xplatform linux-aarch64-gnu-g ^ -prefix F:\lin-dev\work\Qt-cross-compile\Qt5.12.3-arm64-win ^ -release ^ -opensource ^ -confirm-license ^ -nomake tests ^ -nomake examples ^ -no-opengl ^ -no-openssl ^ -no-cups ^ -no-dbus ^ -no-sqlite ^ -no-iconv ^ -qt-libjpeg ^ -qt-libpng ^ -qt-zlib ^ -skip qtwebengine ^ -skip qtdeclarative ^ -skip qtmultimedia ^ -skip qtwayland ^ -skip qt3d ^ qtwebsockets ^ QMAKE_CXXFLAGS-Wno-free-nonheap-object -Wno-deprecated-copy -Wno-error -fpermissive
返回列表