「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 \                       
交叉编译libx加GTK+2.1时候用到库各个库文件的集合,不用花费时间网上一个一个下载,已经经过本人亲测试实测,还可以编译GTK+directFB 1.1 libs_for_gtk Dir: atk-1.25.2.tar.gz atk-1.26.0.tar.gz bigreqsproto-1.1.2.tar.bz2 cairo-1.8.6.tar.gz CPAN-1.94.tar.gz DirectFB-1.1.1.tar.gz expat-2.0.1.tar.gz expat-2.1.0.tar.gz ExtUtils-MakeMaker-6.20.tar.gz fontconfig-2.4.2.tar.gz fontconfig-2.6.0.tar.gz fontconfig-2.7.3.tar.gz freetype-2.3.5.tar.bz2 freetype-doc-2.3.6.tar.bz2 glib-2.12.1.tar.bz2 glib-2.14.4.tar.gz glib-2.18.2.tar.bz2 glibc-2.2.5.tar.bz2 gtk+-2.10.14.tar.bz2 gtk+-2.10.7.tar.bz2 gtk+-2.12.12.tar.bz2 inputproto-2.2.tar.bz2 jpegsrc.v6b.rar jpegsrc.v6b.tar.gz kbproto-1.0.6.tar.bz2 libpng-1.2.10.tar.bz2 libpng-1.2.32.tar.lzma libpthread-stubs_0.1.orig.tar.gz libtool-1.5.22.tar.gz libtool-2.4.2.tar.xz libX11-1.0.3.tar.bz2 libX11-1.2.2.tar.bz2 libX11-1.3.2.tar.gz libX11-1.5.0.tar.bz2 libXau-1.0.7.tar.bz2 libXau-1.0.8.tar.bz2 libxcb-1.3.tar.bz2 libxcb-1.4.tar.bz2 libxcb-1.8.1.tar.bz2 libXdmcp-1.0.3.tar.gz libXdmcp-1.1.2.tar.bz2 libXext-1.0.1.tar.bz2 libXfont-1.4.4.tar.bz2 libXft-2.1.12.tar.bz2 libXft-2.1.13.tar.bz2 libxml2-2.6.30.tar.gz libxml2-2.6.32.tar.gz libxslt-1.1.29.tar.gz libXt-1.0.6.tar.bz2 pango-1.16.4.tar.bz2 pango-1.18.2.tar.gz pango-1.22.1.tar.bz2 pango-1.24.4.tar.bz2 pixman-0.24.0.tar.bz2 poky-pinky-3.1.1.tgz stubs-soft.h tiff-3.8.2.tar.gz tiff-4.0.7.tar.gz tslib-1.4.tar.gz xcb-proto-1.7.1.tar.bz2 xcmiscproto-1.1.2.tar.bz2 xcmiscproto-1.2.2.tar.bz2 xextproto-7.2.1.tar.bz2 xorg-server-1.3.0.0.tar.bz2 xorg-server-1.4.2.tar.bz2 xproto-7.0.23.tar.bz2 xtrans-1.2.7.tar.bz2 zlib-1.2.3.rar zlib-1.2.3.tar.gz zlib-1.2.5.tar.gz
<think>好的,用户之前问过如何配置Qt的参数来使用自己的交叉编译工具链,现在他进一步询问如何编写qmake.conf文件,并希望得到详细的解释。我需要先回顾之前的对话,确保现在的回答与之前的指导一致。 用户可能是在配置过程中遇到了问题,或者在创建自定义的mkspecs时遇到了困难。他可能已经按照之前的步骤创建了设备描述符目录,但不太清楚如何正确编写qmake.conf文件。需要详细解释每个配置项的作用,以及如何根据他的工具链进行调整。 首先,我需要解释qmake.conf的作用,它是Qt构建系统的核心配置文件,定义了编译器、链接器、编译选项等。然后,分模块讲解各个部分,比如编译器设置、架构参数、路径配置、设备特定选项等。还要举一个具体的例子,比如针对ARM设备的配置,帮助用户理解如何应用这些设置。 用户可能需要知道如何根据不同的工具链调整参数,比如交叉编译器的前缀、sysroot路径,以及如何处理依赖库的路径。此外,可能还需要说明如何验证配置是否正确,以及在Qt Creator中的集成方法。 要注意用户可能对某些术语不熟悉,需要用简单明了的语言解释,避免过于技术化。同时,确保步骤清晰,提供示例代码和注释,方便用户直接参考和修改。最后,提醒常见错误和调试方法,帮助用户自主排查问题。</think>以下是关于`qmake.conf`文件编写的详细指南,分为核心模块和配置示例: --- ### 一、文件作用与位置 1. **功能定位** `qmake.conf`是Qt构建系统的核心配置文件,用于: - 定义编译器工具链路径 - 设置架构相关编译参数 - 配置第三方库依赖路径 - 指定目标平台特性 2. **存放位置** ```bash qtbase/mkspecs/ ├── devices/ # 设备特定配置 │ └── linux-arm-g++/ │ └── qmake.conf ├── common/ # 通用配置 └── ... ``` --- ### 二、核心配置模块 #### 1. 编译器定义 ```makefile # 工具链可执行文件 QMAKE_CC = arm-linux-gnueabihf-gcc # C编译器 QMAKE_CXX = arm-linux-gnueabihf-g++ # C++编译器 QMAKE_LINK = $$QMAKE_CXX # 可执行文件链接器 QMAKE_LINK_SHLIB = $$QMAKE_CXX # 动态库链接器 # 二进制工具 QMAKE_AR = arm-linux-gnueabihf-ar cqs # 静态库打包 QMAKE_STRIP = arm-linux-gnueabihf-strip # 符号剥离工具 ``` #### 2. 架构参数 ```makefile # CPU架构指令集 QMAKE_CFLAGS += -march=armv8-a -mtune=cortex-a53 -mfpu=neon-fp-armv8 QMAKE_CXXFLAGS += $$QMAKE_CFLAGS # 浮点运算配置 QMAKE_CFLAGS += -mfloat-abi=hard QMAKE_LFLAGS += -mfloat-abi=hard ``` #### 3. 路径配置 ```makefile # 系统根目录 SYSROOT = /opt/sdk/sysroot # 头文件搜索路径 QMAKE_INCDIR += $${SYSROOT}/usr/include \ $${SYSROOT}/usr/include/glib-2.0 # 库文件搜索路径 QMAKE_LIBDIR += $${SYSROOT}/usr/lib \ $${SYSROOT}/lib ``` #### 4. 链接器配置 ```makefile # 运行时库路径设置 QMAKE_LFLAGS += -Wl,-rpath-link,$${SYSROOT}/usr/lib \ -Wl,-rpath-link,$${SYSROOT}/lib # 动态库链接方式 QMAKE_LFLAGS += -Wl,--no-undefined \ -Wl,--as-needed ``` #### 5. 设备特性 ```makefile # OpenGL配置 QT_CONFIG += opengles2 QMAKE_LIBS_OPENGL = -lGLESv2 # 输入系统支持 QT_CONFIG += linuxfb # Framebuffer支持 QT_CONFIG += evdev # 输入设备支持 ``` --- ### 三、完整配置示例(ARM设备) ```makefile # 文件位置:qtbase/mkspecs/devices/linux-arm-myboard-g++/qmake.conf include(../common/linux_device_pre.conf) # 工具链定义 QMAKE_CC = $${CROSS_COMPILE}gcc QMAKE_CXX = $${CROSS_COMPILE}g++ QMAKE_LINK = $$QMAKE_CXX # 架构参数 QMAKE_CFLAGS = -march=armv7ve -mfpu=neon-vfpv4 -mfloat-abi=hard QMAKE_CXXFLAGS = $$QMAKE_CFLAGS # 系统根目录 SYSROOT = /opt/myboard/sysroot QMAKE_INCDIR += $${SYSROOT}/usr/include QMAKE_LIBDIR += $${SYSROOT}/usr/lib # 链接器设置 QMAKE_LFLAGS += -Wl,-rpath-link,$${SYSROOT}/usr/lib \ -Wl,-O1 \ -Wl,--hash-style=gnu # 第三方库 QMAKE_LIBS += -lpthread -lrt -ldl QMAKE_LIBS_OPENGL_ES2 = -lGLESv2 -lEGL # 设备特性 QT_CONFIG += opengles2 linuxfb evdev include(../common/linux_device_post.conf) ``` --- ### 四、调试技巧 1. **参数验证** ```bash # 查看最终生效的qmake配置 qmake -query # 检查架构参数 qmake -query QMAKE_CFLAGS ``` 2. **覆盖配置** 在工程.pro文件中临时覆盖: ```makefile # 覆盖编译参数 QMAKE_CXXFLAGS += -DDEBUG_MODE # 添加额外库 LIBS += -lcustom_lib ``` 3. **错误诊断** 当出现链接错误时,添加以下参数显示详细链接过程: ```makefile QMAKE_LFLAGS += -Wl,--verbose ``` --- ### 五、配置层级关系 ```bash Qt构建系统配置优先级: 1. 项目.pro文件中的设置 # 最高优先级 2. mkspecs/qmake.conf # 设备级配置 3. mkspecs/common/linux.conf # 平台通用配置 4. qmake默认配置 # 最低优先级 ``` 通过合理设计`qmake.conf`文件,可以实现: - 跨平台编译配置的统一管理 - 设备特定参数的集中维护 - 第三方依赖的自动解析 - 构建选项的灵活控制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值