【问题标题】:How to compile for Windows on Linux with gcc/g++?如何使用 gcc/g++ 在 Linux 上为 Windows 编译?
【发布时间】:2011-01-03 06:56:33
【问题描述】:

我在 Linux 上使用 freeglut 用 C++ (g++) 编写了一些效果,我用它们编译了

g++ -Wall -lglut part8.cpp -o part8

所以我想知道是否可以让 g++ 生成包含所需所有内容的静态编译 Windows 可执行文件?

我没有 Windows,所以如果我能在 Linux 上做到这一点,那就太棒了:)

【问题讨论】:

  • @AndiDog,“第一剂免费”,对。无论如何,没有必要在 Windows 机器上设置自动构建过程,而您已经完成了一个适用于 Linux 的工作。
  • 如果没有 Windows,您将如何测试您的 Windows 软件?使用葡萄酒?
  • @el.pescado,构建和测试是完全不同的任务。前者不需要 Windows。

标签: c++ opengl gcc glut freeglut


【解决方案1】:

mingw32 作为 Linux 软件包存在。您可以使用它交叉编译和链接 Windows 应用程序。有一个教程here at the Code::Blocks forum。请注意,例如,命令更改为 x86_64-w64-mingw32-gcc-win32

例如,Ubuntu 的存储库中有 MinGW:

$ apt-cache search mingw
[...]
g++-mingw-w64 - GNU C++ compiler for MinGW-w64
gcc-mingw-w64 - GNU C compiler for MinGW-w64
mingw-w64 - Development environment targeting 32- and 64-bit Windows
[...]

【讨论】:

  • 如果你使用 debian,mingw32 已经在仓库中,还有一些预编译的库。
  • 嗯,nongnu.org/mingw-cross-env 有一个交叉编译环境。例如,它包括 freeglut。但我没用过这个,所以不要问我;)
  • mingw32 中的“32”是否意味着我只能生成 32 位二进制文​​件?是否也有生成 64 位二进制文​​件的解决方案?
  • bluenote10:有为 x64 构建的变体,例如“x86_64-w64-mingw32-g++”。基础“mingw32”可能有能力也可能没有,但按名称安装/使用变体很容易。 ar2015:它根本不支持 C++11 还是你在谈论你遇到的问题?正如我们所说,我正在努力让一个项目与 mingw 一起构建,这将是一个很好的信息。其他线程表明它确实支持 c++11(例如stackoverflow.com/questions/16136142/…)。我当然很乐意提供帮助,但最好单独发一篇文章。
  • 这个话题最近有变化吗?
【解决方案2】:

在 Linux 中为 Windows 编译的一个选项是通过 mingw。我找到了一个非常有用的教程here

要在基于 Debian 的系统上安装 mingw32,请运行以下命令:
sudo apt-get install mingw32

要编译您的代码,您可以使用类似:
i586-mingw32msvc-g++ -o myApp.exe myApp.cpp

您有时会想直接在 Linux 中测试新的 Windows 应用程序。您可以为此使用葡萄酒,但您应该始终牢记葡萄酒可能有虫子。这意味着您可能无法确定错误是否存在于 wine、您的程序或两者中,因此请仅将 wine 用于一般测试。

要安装 wine,请运行:
sudo apt-get install wine

【讨论】:

  • 你不需要指定mingw32-binutilsmingw32-runtime,因为它们是mingw32的依赖项
  • 酷,cpp 有非常简单的错误(void main(){} 等...),我猜它在 windows 上编译但在 mingw 上失败,我修复了它们。我也尝试过i586-mingw32msvc-cpp,它生成了一个文本文件,其中包含要编译的东西,哈哈。g++ 可以工作,谢谢!
  • @henje 要彻底,如果您不指定它们,它们可以在卸载 mingw32 时由包管理器自动删除(标记为“依赖项”。我指定它们,它们不会(标记为“手动”)。
【解决方案3】:

建议的方法在 Ubuntu 16.04 上给了我错误:E: Unable to locate package mingw32

================================================ ==============================

要在 Ubuntu 上安装此软件包,请使用以下命令:

sudo apt-get install mingw-w64

安装后即可使用:

x86_64-w64-mingw32-g++

请注意!

对于 64 位使用:x86_64-w64-mingw32-g++

对于 32 位使用:i686-w64-mingw32-g++

【讨论】:

  • 我试过了。它只是抛出关于 DWORD、LPVOID、WORD、BYTE 等的各种错误。没有做任何交叉编译
  • @RichardMcFriendOluwamuyiwa 看起来你错过了一些在 linux 上编译它的头文件。它可以生成在 Win 机器上运行的二进制文件。请更新您的来源。
  • 我通过在 winbase.h 标头之前包含 windows.h 使其工作。 VS 代码会自动重新排列包含并导致错误,因此我不得不通过空注释行强制排序
【解决方案4】:

从包管理器安装交叉编译器,例如 mingw64。 然后按以下方式编译:而不是简单地调用 gcc 调用 i686-w64-mingw32-gcc 用于 32 位 Windows 或 x86_64-w64-mingw32-gcc" 用于 64 位 Windows。我也会使用--static 选项,因为目标系统可能没有所有库。

如果要编译其他语言,如 Fortran,请将前面命令中的 -gcc 替换为 -gfortran

【讨论】:

    【解决方案5】:

    我在 Linux 上使用 mingw 在 C 中制作 Windows 可执行文件,我怀疑 C++ 也可以。

    我有一个项目,ELLCC,将 clang 和其他东西打包成一个交叉编译器工具链。我用它为 Windows 编译 clang (C++)、binutils 和 GDB。请点击ellcc.org 的下载链接,获取适用于多个 Linux 主机的预编译二进制文件。

    【讨论】:

    • 自从我发布了这个答案,我走得更远了。我有一个项目,ELLCC,将 clang 和其他东西打包成一个交叉编译器工具链。我用它为 Windows 编译 clang (C++)、binutils 和 GDB。请点击ellcc.org 的下载链接,获取适用于多个 Linux 主机的预编译二进制文件。
    【解决方案6】:

    发件人:https://fedoraproject.org/wiki/MinGW/Tutorial

    从 Fedora 17 开始,可以轻松地为 win32 和 win64 目标构建(交叉编译)二进制文件。这是使用 mingw-w64 工具链实现的:http://mingw-w64.sf.net/。使用此工具链,您可以为以下编程语言构建二进制文件:C、C++、Objective-C、Objective-C++ 和 Fortran。

    “使用 Windows 交叉编译器的提示和技巧”:https://fedoraproject.org/wiki/MinGW/Tips

    【讨论】:

      【解决方案7】:

      对于 Fedora:

      # Fedora 18 or greater
      sudo dnf group install "MinGW cross-compiler"
      
      # Or (not recommended, because of its deprecation)
      sudo yum groupinstall -y "MinGW cross-compiler"
      

      【讨论】:

      • 对于所有 Fedora 用户:这里有一个很棒的教程:fedoraproject.org/wiki/MinGW(因链接错误而编辑)
      • 正是我想要的!也适用于sudo dnf groupinstall ...
      猜你喜欢
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多