「qt交叉编译arm64」支持xcb、X11

完整的交叉编译好支持xcb的qt库(qt5.15.2、arm64、xcb、no-opengl)

已安装xcb、X11库的交叉编译器(x86_64-aarch64-linux-gnu)

1. 修改qmake.conf,指定交叉编译器

Qt教程3-Ubuntu(x86_64)上配置arm64(aarch64)交叉编译环境及QT编译arm64架构工程

/home/alexios/Qt/5.15.2目录下,有以下内容:

——sha1s.txt:包含文件或版本校验值的文本文件,方便验证文件完整性。

——Src:Qt 源代码所在的文件夹,用于自定义编译或查看代码。

——gcc_64:用于 64 位 GCC 编译器的 Qt 构建版本。

——wasm_32:Qt WebAssembly 的 32 位构建版本,用于将应用程序部署在 Web 浏览器中。

/home/alexios/Qt/5.15.2/Src/qtbase/mkspecs/linux-aarch64-gnu-g++编辑qmake.conf配置文件

# qmake configuration for building with aarch64-linux-gnu-g++
# 用于使用 aarch64-linux-gnu-g++ 工具链构建 Qt 的 qmake 配置文件

MAKEFILE_GENERATOR      = UNIX  # 指定 qmake 生成 Makefile 的类型,UNIX 表示为类 Unix 系统
CONFIG                 += incremental  # 启用增量构建,提升编译效率
QMAKE_INCREMENTAL_STYLE = sublib  # 设置增量构建的样式为子库模式(sublib)

# 包含公共配置文件,减少重复定义
include(../common/linux.conf)       # 包含特定于 Linux 平台的通用配置
include(../common/gcc-base-unix.conf)  # 包含 GCC 编译器的通用配置
include(../common/g++-unix.conf)   # 包含 G++ 编译器的通用配置

# 针对 aarch64-linux-gnu-g++ 的工具链配置
QMAKE_CC                = aarch64-linux-gnu-gcc        # 设置 C 编译器
QMAKE_CXX               = aarch64-linux-gnu-g++        # 设置 C++ 编译器
QMAKE_LINK              = aarch64-linux-gnu-g++        # 设置静态链接器
QMAKE_LINK_SHLIB        = aarch64-linux-gnu-g++        # 设置动态链接器

# 针对其他工具的配置
QMAKE_AR                = aarch64-linux-gnu-ar cqs     # 设置归档工具,用于创建静态库;cqs 表示创建时保持静默
QMAKE_OBJCOPY           = aarch64-linux-gnu-objcopy    # 设置对象文件复制与修改工具
QMAKE_NM                = aarch64-linux-gnu-nm -P      # 设置符号表工具,-P 参数显示原始符号表
QMAKE_STRIP             = aarch64-linux-gnu-strip      # 设置剥离工具,用于删除对象文件中的调试信息

# 加载 Qt 配置,用于包含额外的 Qt 构建规则和模块依赖
load(qt_config)

根据自己交叉编译器的名称修改,本机的交叉编译器已在/etc/profile添加了环境变量,且本机只有一个交叉编译器,故只需修改名称。所使用的交叉编译器是在arm官网下载的,gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu,名称中间需添加无厂家-none-

# 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)

校验交叉编译器的环境变量是否加载成功,显示版本号即为安装成功

~$ aarch64-none-linux-gnu-g++ -v
...
gcc 版本 10.2.1 20201103 (GNU Toolchain for the A-profile Architecture 10.2-2020.11 (arm-10.16))

2. 配置编译选项,执行configure

/home/alexios/Qt/5.15.2/Src/configure

该脚本 configure 是 Qt 源代码编译环境的入口,用于配置 Qt 构建参数,确保必要的环境和依赖正确设置。以下是逐行解释和相关注释:

#! /bin/sh
# 指定使用 /bin/sh 作为脚本解释器

License Header
#############################################################################
## ...
## License header (省略)
#############################################################################

这部分是版权声明和许可证信息,明确了脚本使用的许可协议(商业许可或 GPLv3)。


获取脚本所在目录并定位 configure
srcpath=`dirname $0`  
# 获取脚本所在目录的相对路径

srcpath=`(cd "$srcpath"; pwd)`  
# 将相对路径转换为绝对路径,确保脚本运行时无论从哪里调用都能正确找到资源

configure=$srcpath/qtbase/configure  
# 设置目标配置工具的路径,位于源码目录的 `qtbase/configure`

if [ ! -e "$configure" ]; then  
    echo "$configure not found. Did you forget to run \"init-repository\"?" >&2  
    exit 1  
fi  
# 检查目标配置文件是否存在,如果没有找到,提醒用户是否忘记运行初始化命令 `init-repository`

创建 qtbase 目录并进入
mkdir -p qtbase || exit  
# 确保 `qtbase` 目录存在,如果无法创建则退出脚本

echo "+ cd qtbase"  
cd qtbase || exit  
# 进入 `qtbase` 目录,失败则退出

执行配置命令
echo "+ $configure -top-level $@"  
# 显示将要执行的命令,方便用户调试

exec "$configure" -top-level "$@"  
# 执行 `qtbase/configure`,并传递所有脚本参数(`$@`)
# `-top-level` 参数用于指示配置为顶层构建

使用方法

在Qt下新建build文件夹,存放构建文件;新建Qt5.15.2-arm64,存放编译好的库文件。

进入build文件夹,在命令行中运行该脚本时,可以通过附加参数控制 Qt 的构建选项。例如:

./../5.15.2/Src/configure -prefix /home/alexios/Qt/Qt5.15.2-arm64 -make libs -xplatform linux-aarch64-gnu-g++ -skip qtdeclarative -no-opengl -force-debug-info -mp
  • -prefix:指定安装路径。
  • -make libs:只编译库文件,不包含示例、测试或工具。
  • -platform linux-aarch64-gnu-g++: 指定目标平台为 aarch64,并使用 GNU 工具链,位于/home/alexios/Qt/5.15.2/Src/qtbase/mkspecs下,已在前面修改过qmake.conf,指定自定义的交叉编译器。
  • -skip qtdeclarative:跳过 qtdeclarative 模块的构建,减少编译时间或避免某些依赖。
  • -no-opengl:禁用OpenGL。
  • -static 生成静态库.a文件 -shared 生成动态库so文件(参数可选,默认是shared)
  • -force-debug-info :强制生成调试信息(参数可选)这个参数是让Qt release版本生成.pdb文件,若在release版本下设置了异常捕获信息函数,则打印出错堆栈信息必须要有.pdb文件。如果程序没用开启异常捕获选项,是不需要开启这个参数的。
  • -mp:启动多核编译。

3. 不直接运行命令,可创建脚本执行

步骤2是执行configure生成Makefile,但命令比较长,我们可以创建一个脚本文件,执行该脚本生成Makefile。在build目录下新建autoconfigure.sh脚本。

#!/bin/bash
./../5.15.2/Src/configure -prefix /home/alexios/Qt/Qt5.15.2-arm64 \  # 指定安装路径
# -static \                                  # 静态链接模式,Qt 库将被编译成静态库,而不是动态库(.so)
# -release \                                 # 构建发布版本,生成优化后的版本,适合生产环境
-opensource \                                # 使用开源许可证,适合非商业项目的开发和分发,通常采用 GPL 或 LGPL
-make libs \                                 # 只构建 Qt 核心库(libs),不包括其他工具、示例和测试程序
-xplatform linux-aarch64-gnu-g++ \          # 指定交叉编译平台,目标平台为 ARM64 架构,使用 GNU 工具链
# -optimized-qmake \                         # 优化后的 qmake 工具,提升构建效率
# -pch \                                     # 预编译头文件(PCH)功能,减少编译时间,尤其是包含大型头文件时
# -qt-zlib \                       
Building on: linux-g++ (x86_64, CPU features: mmx sse sse2) Building for: linux-aarch64-gnu-g++ (arm64, CPU features: neon) Target compiler: gcc 6.3.1 Configuration: cross_compile use_gold_linker compile_examples enable_new_dtags largefile neon precompile_header shared rpath release c++11 c++14 concurrent dbus reduce_exports stl Build options: Mode ................................... release Optimize release build for size ........ no Building shared libraries .............. yes Using C standard ....................... C11 Using C++ standard ..................... C++14 Using ccache ........................... no Using gold linker ...................... yes Using new DTAGS ........................ yes Using precompiled headers .............. yes Using LTCG ............................. no Target compiler supports: NEON ................................. yes Build parts ............................ libs Qt modules and options: Qt Concurrent .......................... yes Qt D-Bus ............................... yes Qt D-Bus directly linked to libdbus .... no Qt Gui ................................. yes Qt Network ............................. yes Qt Sql ................................. yes Qt Testlib ............................. yes Qt Widgets ............................. yes Qt Xml ................................. yes Support enabled for: Using pkg-config ....................... yes udev ................................... no Using system zlib ...................... yes Qt Core: DoubleConversion ....................... yes Using system DoubleConversion ........ no GLib ................................... no iconv .................................. yes ICU .................................... no Tracing backend ........................ Logging backends: journald ............................. no syslog ............................... no slog2 ................................ no Using system PCRE2 ..................... no Qt Network: getifaddrs() ........................... yes IPv6 ifname ............................ yes libproxy ............................... no Linux AF_NETLINK ....................... yes OpenSSL ................................ yes Qt directly linked to OpenSSL ........ no OpenSSL 1.1 ............................ no DTLS ................................... yes SCTP ................................... no Use system proxies ..................... yes Qt Gui: Accessibility .......................... yes FreeType ............................... yes Using system FreeType ................ no HarfBuzz ............................... yes Using system HarfBuzz ................ no Fontconfig ............................. no Image formats: GIF .................................. yes ICO .................................. yes JPEG ................................. yes Using system libjpeg ............... yes PNG .................................. yes Using system libpng ................ no EGL .................................... no OpenVG ................................. no OpenGL: Desktop OpenGL ....................... no OpenGL ES 2.0 ........................ no OpenGL ES 3.0 ........................ no OpenGL ES 3.1 ........................ no OpenGL ES 3.2 ........................ no Vulkan ................................. no Session Management ..................... yes Features used by QPA backends: evdev .................................. yes libinput ............................... no INTEGRITY HID .......................... no mtdev .................................. no tslib .................................. no xkbcommon .............................. no X11 specific: XLib ................................. no EGL on X11 ........................... no QPA backends: DirectFB ............................... no EGLFS .................................. no LinuxFB ................................ yes VNC .................................... yes Mir client ............................. no Qt Sql: SQL item models ........................ yes Qt Widgets: GTK+ ................................... no Styles ................................. Fusion Windows Qt PrintSupport: CUPS ................................... no Qt Sql Drivers: DB2 (IBM) .............................. no InterBase .............................. no MySql .................................. no OCI (Oracle) ........................... no ODBC ................................... no PostgreSQL ............................. no SQLite2 ................................ no SQLite ................................. yes Using system provided SQLite ......... no TDS (Sybase) ........................... no Qt Testlib: Tester for item models ................. yes Qt SerialBus: Socket CAN ............................. yes Socket CAN FD .......................... yes Qt QML: QML network support .................... yes QML debugging and profiling support .... yes QML sequence object .................... yes QML list model ......................... yes QML XML http request ................... yes QML Locale ............................. yes QML delegate model ..................... yes Qt Quick: Direct3D 12 ............................ no AnimatedImage item ..................... yes Canvas item ............................ yes Support for Qt Quick Designer .......... yes Flipable item .......................... yes GridView item .......................... yes ListView item .......................... yes TableView item ......................... yes Path support ........................... yes PathView item .......................... yes Positioner items ....................... yes Repeater item .......................... yes ShaderEffect item ...................... yes Sprite item ............................ yes Qt Scxml: ECMAScript data model for QtScxml ...... yes Qt Gamepad: SDL2 ................................... no Qt 3D: Assimp ................................. yes System Assimp .......................... no Output Qt3D Job traces ................. no Output Qt3D GL traces .................. no Use SSE2 instructions .................. no Use AVX2 instructions .................. no Aspects: Render aspect ........................ yes Input aspect ......................... yes Logic aspect ......................... yes Animation aspect ..................... yes Extras aspect ........................ yes Qt 3D Renderers: OpenGL Renderer ........................ yes Qt 3D GeometryLoaders: Autodesk FBX ........................... no Qt Wayland Client ........................ no Qt Wayland Compositor .................... no Qt Bluetooth: BlueZ .................................. no BlueZ Low Energy ....................... no Linux Crypto API ....................... no WinRT Bluetooth API (desktop & UWP) .... no Qt Sensors: sensorfw ............................... no Qt Quick Controls 2: Styles ................................. Default Fusion Imagine Material Universal Qt Quick Templates 2: Hover support .......................... yes Multi-touch support .................... yes Qt Positioning: Gypsy GPS Daemon ....................... no WinRT Geolocation API .................. no Qt Location: Qt.labs.location experimental QML plugin . yes Geoservice plugins: OpenStreetMap ........................ yes HERE ................................. yes Esri ................................. yes Mapbox ............................... yes MapboxGL ............................. no Itemsoverlay ......................... yes QtXmlPatterns: XML schema support ..................... yes Qt Multimedia: ALSA ................................... no GStreamer 1.0 .......................... no GStreamer 0.10 ......................... no Video for Linux ........................ yes OpenAL ................................. no PulseAudio ............................. no Resource Policy (libresourceqt5) ....... no Windows Audio Services ................. no DirectShow ............................. no Windows Media Foundation ............... no Qt Tools: QDoc ................................... no Qt WebEngine: Embedded build ......................... yes Pepper Plugins ......................... no Printing and PDF ....................... no Proprietary Codecs ..................... no Spellchecker ........................... yes Native Spellchecker .................... no WebRTC ................................. no Use System Ninja ....................... no Geolocation ............................ yes WebChannel support ..................... yes Use v8 snapshot ........................ yes Kerberos Authentication ................ no Building v8 snapshot supported ......... yes Use ALSA ............................... no Use PulseAudio ......................... no Optional system libraries used: re2 .................................. no icu .................................. no libwebp, libwebpmux and libwebpdemux . no opus ................................. no ffmpeg ............................... no libvpx ............................... no snappy ............................... no glib ................................. no zlib ................................. yes minizip .............................. no libevent ............................. no jsoncpp .............................. no protobuf ............................. no libxml2 and libxslt .................. no lcms2 ................................ no png .................................. no JPEG ................................. no harfbuzz ............................. no freetype ............................. no x11 .................................. no Required system libraries: fontconfig ........................... no dbus ................................. no nss .................................. no khr .................................. no glibc ................................ yes Required system libraries for qpa-xcb: libdrm ............................... no xcomposite ........................... no xcursor .............................. no xi ................................... no xrandr ............................... no xtst ................................. no Note: Also available for Linux: linux-clang linux-icc
### 关于如何交叉编译 Qt 源码以支持 QtWayland #### 配置环境与工具链 为了成功地交叉编译Qt源码来支持QtWayland,首先需要准备适合目标平台的工具链。如果采用的是特定架构如ARM,则应选用相应的交叉编译器,比如`aarch64-linux-gnu-gcc`[^2]。 #### 下载并解压Qt源码包 获取所需版本的Qt源代码压缩文件后将其解压至工作目录中,在此之后可以开始设置编译选项前的各项准备工作。 #### 编译配置阶段 进入Qt源码根目录运行`./configure`脚本之前,需确保已经安装好了必要的依赖项以及设置了正确的环境变量以便链接到所选中的toolchain。对于启用QtWayland的支持来说,可以在调用`configure`的时候加入参数`-qt-wayland`或者更具体的模块名称,例如: ```bash ./configure -prefix /opt/qtwayland \ -release \ -opensource \ -confirm-license \ -nomake examples \ -no-opengl \ -skip qtwebengine \ -device linux-arm-generic-g++ \ -sysroot $SYSROOT_PATH \ -xplatform linux-aarch64-gnu-g++ \ -qt-wayland ``` 上述命令片段展示了部分常用的配置选项;其中特别指定了设备类型(`linux-arm-generic-g++`)、系统根路径($SYSROOT_PATH),还有最重要的就是启用了QtWayland功能(-qt-wayland)[^1]。 #### 执行编译过程 完成以上步骤后就可以正式开始了!通常情况下只需简单输入make指令即可启动整个构建流程: ```bash make -j$(nproc) ``` 这里利用了多线程加速编译速度(`-j$(nproc)`表示根据CPU核心数自动调整并发任务数量)。当所有组件都被正确编译完成后,再继续执行安装操作: ```bash sudo make install ``` 这会把新编译出来的Qt库及相关资源部署到前面通过`-prefix`指定的目标位置上。 #### 测试验证 最后一步是要确认一切正常运作,可以通过编写简单的测试程序来进行初步检验。创建一个新的CMake项目或者其他形式的应用工程,并尝试引入QtWayland相关的类和服务接口,观察能否顺利编译并通过模拟或真实硬件上的演示证明其可用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值