在Linux上为Windows目标配置Qt交叉编译

问题描述

我想使用Linux x86_64主机为Windows x86_64目标交叉编译Qt库(最终也包括我的应用程序)。我觉得自己已经接近成功了,但可能对整个过程有一些基本的误解。

我从在我的Fedora机器上安装所有mingw包开始,并修改了win32-g++的qmake.conf文件以适应我的环境。然而,我似乎在Qt的某些显而易见的配置选项上遇到了问题:-platform-xplatform。Qt文档说-platform应该是主机架构(你正在编译的机器),而-xplatform应该是你希望部署的目标平台。在我的情况下,我设置了-platform linux-g++-64-xplatform linux-win32-g++,其中linux-win32-g++是我修改过的win32-g++配置。

我的问题是,在使用这些选项执行配置后,我看到它调用了我系统的编译器而不是交叉编译器(x86_64-w64-mingw32-gcc)。如果我省略了-xplatform选项并将-platform设置为我的目标规范(linux-win32-g++),它会调用交叉编译器,但在发现一些与Unix相关的函数未定义时出错。

某次尝试的输出: Pastebin链接

问题

  1. 当从Linux主机为Windows交叉编译Qt时,本地编译器是否会被调用?也就是说,在交叉编译过程中,我们应该仅使用交叉编译器吗?我不明白为什么在指定-xplatform选项时,Qt的配置脚本会调用我系统的本地编译器。
  2. 如果我使用的是mingw交叉编译器,什么时候需要处理一个specs文件?GCC的specs文件对我来说仍然很神秘,我想知道一些相关背景是否会有所帮助。
  3. 一般来说,除了在我的qmake.conf中指定一个交叉编译器外,我还需要考虑什么?
答案整理
答案1:使用MXE进行交叉编译

跨平台编译Qt的一个简便方法是使用MXE(M cross environment)。步骤如下:

  1. 获取MXE:

    sh 复制代码
    git clone https://github.com/mxe/mxe.git
  2. 安装构建依赖。

  3. 构建Qt及其依赖项和交叉构建工具,这大约需要一小时:

    sh 复制代码
    cd mxe && make qt
  4. 将交叉构建工具添加到你的PATH环境变量中:

    sh 复制代码
    export PATH=<mxe root>/usr/bin:$PATH
  5. 使用qmake生成Makefile并构建:

    sh 复制代码
    <mxe root>/usr/i686-pc-mingw32/qt/bin/qmake && make
  6. 你应该能在./release目录下找到二进制文件:

    sh 复制代码
    wine release/foo.exe
答案2:使用Archlinux的MinGW-w64工具链

另一个方法是在基于Arch的系统上使用MinGW-w64工具链:

  1. 安装必要的软件包:

    sh 复制代码
    yay -Sy mingw-w64-qt5-base mingw-w64-boost
  2. 在项目目录中使用交叉编译工具进行构建:

    sh 复制代码
    x86_64-w64-mingw32-qmake-qt5
    make
  3. 部署时需要将对应的dll文件复制到你的可执行文件目录中。

注意事项
  • 在配置Qt时,如果遇到idc相关问题,添加-skip qtactiveqt参数可以跳过这些问题。
  • 在配置过程中,本地主机的编译器可能会被调用,用于构建一些必要的工具,例如qmake
sh 复制代码
cd qt_source_directory
mkdir my_build
cd my_build
../configure \
  -release \
  -opensource \
  -no-compile-examples \
  -platform linux-g++-64 \
  -xplatform win32-g++ \
  -device-option CROSS_COMPILE=/usr/bin/x86_64-w64-mingw32- \
  -skip qtactiveqt \
  -v

结论

交叉编译Qt从Linux到Windows涉及指定正确的配置参数并确保交叉编译器被正确调用。使用像MXE或Archlinux的MinGW-w64工具链能简化这个过程,避免许多潜在的问题。

相关推荐
载数而行520几秒前
Linux 8 进程(树)相关指令
linux
ShineWinsu1 分钟前
对于Linux:内核是如何组织管理IPC资源的解析
linux·服务器·c++·面试·笔试·线程·ipc
X_szxj7 分钟前
Windows安装liboqs库
windows·github
luoyayun36118 分钟前
Qt + FFmpeg 实战:获取音视频文件基础属性、流信息和元数据
qt·ffmpeg·音视频·元数据·获取音视频文件属性
caimouse26 分钟前
Reactos 第 5 章 进程与线程 — 5.1 概述
c语言·windows·架构
feng_you_ying_li28 分钟前
Linux之线程同步:条件变量和两种生产消费模型
linux·运维·服务器
mN9B2uk1731 分钟前
在Qt中使用SQLite数据库
数据库·qt·sqlite
Dlrb121135 分钟前
Linux系统编程-线程与多线程模块的封装
linux·线程·互斥锁·线程同步·线程互斥
拾贰_C36 分钟前
【Ubuntu | VSCode | SSH | 远程连接 | Linux】VSCode 怎么实现ssh远程连接
linux·vscode·ubuntu
玖釉-40 分钟前
nvpro_core2 详解:NVIDIA Vulkan / OpenGL 图形样例背后的现代 C++ 基础库
c++·windows·图形渲染