当前位置: 首页 > news >正文

在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:

    git clone https://github.com/mxe/mxe.git
    
  2. 安装构建依赖。

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

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

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

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

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

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

  1. 安装必要的软件包:

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

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

注意事项
  • 在配置Qt时,如果遇到idc相关问题,添加-skip qtactiveqt参数可以跳过这些问题。
  • 在配置过程中,本地主机的编译器可能会被调用,用于构建一些必要的工具,例如qmake
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工具链能简化这个过程,避免许多潜在的问题。

http://www.lryc.cn/news/379067.html

相关文章:

  • Introduction to linear optimization 第 2 章课后题答案 11-15
  • Java——包
  • Pipeline知识小记
  • postman国内外竞争者及使用详解分析
  • 人工智能对决:ChatGLM与ChatGPT,探索发展历程
  • 探索Python元类的奥秘及其应用场景
  • C语言基础关键字的含义和使用方法
  • 【Golang - 90天从新手到大师】Day09 - string
  • 网络安全与区块链技术:信任与安全的融合
  • MySQL之复制(九)
  • 【面试干货】 Java 中的 HashSet 底层实现
  • 爬虫经典案例之爬取豆瓣电影Top250(方法二)
  • 如何优化React应用的性能?
  • css文字镂空加描边
  • python数据分析与可视化
  • webkit 的介绍
  • make与makefile
  • 深度神经网络一
  • Pnpm:包管理的新星,如何颠覆 Npm 和 Yarn
  • 汽车IVI中控开发入门及进阶(三十二):i.MX linux开发之Yocto
  • tessy 编译报错:单元测试时,普通桩函数内容相关异常场景
  • 计算机专业是否仍是“万金油”
  • 雷池社区版自动SSL
  • 怎样减少徐州服务器租用的成本?
  • 【性能优化】表分桶实践最佳案例
  • 数据仓库的挑战
  • 基于ResNet-18的简单分类(新手,而且网络效果不咋滴,就是学个流程)
  • 自动化测试:Autorunner的使用
  • 时序预测 | Matlab基于CNN-BiLSTM-Attention多变量时间序列多步预测
  • 软考 系统架构设计师系列知识点之杂项集萃(42)