c++ - 如何将 Ubuntu 上的应用程序交叉编译到 Windows

标签 c++ qt clang++ mingw-w64 cross-build

我一直在 Qt Creator 中开发基于 Ubuntu 上的 Qt 5 的应用程序。使用的项目格式是CMake。是时候将这些内容交叉编译成可以在 Windows 上运行的二进制文件了。所以我有

  1. 已安装 clang 和 mingw-w64
  2. 创建了一个指向正确工具(来自已安装的 MiGW 工具链的工具)的 CMake 工具链文件,并将目标三元组设置为 x86_64-w64-mingw32(使用此三元组是因为它对应于gcc工具链安装路径)。
  3. https://dl.fedoraproject.org/pub/fedora/linux/development/30/Everything/x86_64/os/Packages/m/ 下载了从 mingw64-qt 开始的软件包,解压它们,合并解压后的目录,删除不需要的任何内容,修复CMake脚本以使它们对应于系统中的路径(脚本中有一些硬编码的路径)。
  4. 将解压后的 Qt 所需目录的路径添加到工具链文件中,以使自动发现工作
  5. 尝试构建。

当我尝试构建时,我的项目的某些文件(6)编译良好,但 4 个文件导致了严重的编译错误:

/usr/share/mingw-w64/include/rpcndr.h:64:11: error: reference to ‘byte’ is ambiguous
/usr/share/mingw-w64/include/objidlbase.h:2067:5: error: ‘byte’ has not been declared

好吧,我想,也许 Ubuntu 存储库中的 MinGW-w64 已经烂了?事实上是的,Ubuntu 存储库中是 6.0,但 MinGW-w64 网站上提供了 8.1。

好的。我已经卸载了软件包,下载了https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/8.1.0/threads-posix/seh/x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z ,解压它,设置工具链文件使用 clang 和 clang++ 作为编译器和 llvm binutils,设置 sysroot 指向解压的目录,尝试重建...并得到相同的错误(但在新的 sysroot 中)。

嗯,我尝试构建一些在依赖关系方面更简单的东西以及已知可以由 g++ - ninja 构建的东西。

同样的结果。我尝试过在 wine 中运行 MinGW-w64 工具链(Windows 版本)。结果一样。该死的。

一个简单的 hello world 应用程序可以在所有情况下构建并正常工作。

如何使用 MinGW-w64 stdlib 交叉构建比 Windows 的 hello world 更复杂的应用程序?

我还想知道如何设置 Qt Creator 来正确使用这个工具链。

最佳答案

我使用https://mxe.cc将我的 Qt 应用程序交叉编译到 Windows。您可以将其设置在您的主目录中。在告诉它获取并编译您需要的依赖项(如 qtbase、cmake 等)后,您可以使用以下命令编译您的应用程序:

i686-w64-mingw32.static-cmake path_to_your_project
make

对于 qmake 项目,您可以使用 i686-w64-mingw32.static-qmake

关于c++ - 如何将 Ubuntu 上的应用程序交叉编译到 Windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55601740/

相关文章:

c++ - Qt OpenGL - 半透明对象显示窗口后面的内容

c++ - 无法使用 scons 构建我的单元测试以及程序

c++ - 读取 MP3 文件

android - 在 Android 中移植基于 Qt 的应用程序

c++ - 在 QT Creator 中使用 makefile

c++ - Typedef 到 C++ 中的周围类型

c++ - 如何确定包含路径的来源?

C++ : Ignoring multiple << Operators in a line

c++ - 在 MPI 程序中放置数组创建方法的位置

c++ - 试图在 Windows 7 上分配超过 2GB