在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工具链能简化这个过程,避免许多潜在的问题。

相关推荐
小短腿的代码世界4 小时前
从.qrc到rcc编译器:Qt资源系统的隐秘运作机制与大型项目性能突围
开发语言·qt
匆匆那年9675 小时前
VSCode 远程 Linux 使用Codex
linux·ide·vscode
SWAGGY..6 小时前
Linux系统编程:(七)Makefile入门:轻松掌握编译自动化
linux·运维·自动化
开开心心就好7 小时前
免费流畅的远程控制实用工具
linux·运维·服务器·网络·智能手机·excel
银河外卖员7 小时前
VMware 虚拟机安装 Windows 10 系统详细图文教程
windows·vmware
我在人间贩卖青春7 小时前
重学Qt——Qt常用界面组件
qt
渣渣灰95878 小时前
Windows 10 环境部署 Claude Code 教程
windows·vscode·calude code
黑猫学长呀8 小时前
存储宝典第2篇:盲封TT wafer是什么意思?
linux·嵌入式硬件·项目·芯片·ufs·晶圆·产测
Strugglingler9 小时前
【Linux 用户态操作 UART】
linux·uart
代码熬夜敲Q9 小时前
ENSP 网络工程实验
linux·运维·服务器