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

相关推荐
博语小屋12 分钟前
进程初识之进程状态
linux
吉凶以情迁1 小时前
window服务相关问题探索 go语言服务开发探索调试
linux·服务器·开发语言·网络·golang
axban2 小时前
QT中删除控件的注意事项、deleteLater和delete的区别
java·数据库·qt
柏木乃一2 小时前
Linux初步认识与指令与权限
linux·运维·服务器·shell·权限
Joemt2 小时前
ubuntu源码编译安装cmake高版本、pybind11安装、crow使用
linux·运维·ubuntu
huohuopro3 小时前
在linux(ubuntu)服务器上安装NTQQ并使用
linux·ubuntu
Jooolin3 小时前
Ubuntu?Centos?还是 redhat?Linux 系统选哪个?
linux·ubuntu·ai编程
Sadsvit3 小时前
Linux 进程管理与计划任务
linux·服务器·网络
bigcarp4 小时前
linux + 宝塔面板 部署 django网站 启动方式:uwsgi 和gunicorn如何选择 ?
linux·运维·django