如何使用mingw-w64编译并链接32位Windows可执行文件

36

我正在使用Ubuntu 13.04,并使用apt-get install mingw-w64安装了mingw-w64。我可以使用以下命令编译和链接一个可工作的64位程序版本:

x86_64-w64-mingw32-g++ code.cpp -o app.exe

如何生成一个32位版本的app.exe文件?需要使用哪些二进制或命令行标志?

使用哪些二进制或命令行标志来生成一个32位版本的app.exe文件?

1个回答

48

这取决于您目前使用的工具链的哪个变体。 DWARFSEH 变体(从 GCC 4.8.0 开始提供)仅支持单一目标。您可以通过检查它们的发行版的目录结构来自行查看,即它们只包含具有 64 位或 32 位寻址的库,但两者都不包含。另一方面,普通的 SJLJ 发行版确实是双目标的,为了构建 32 位目标,只需使用 -m32 标志即可。如果这样无效,则只需使用 i686-w64-mingw32-g++ 进行构建。

BONUS


顺便说一下,实现每个 GCC 异常模型 的三个相应的 动态链接库 (DLL) 是:

  1. libgcc_s_dw2-1.dll(DWARF);
  2. libgcc_s_seh-1.dll(SEH);
  3. libgcc_s_sjlj-1.dll(SJLJ)。

因此,要找出您当前的 MinGW-w64 发行版到底提供了哪种异常模型,您可以选择:

  1. 检查 MinGW-w64 安装的目录和文件结构,希望找到其中一种 DLL(通常在 bin 中);或者
  2. 构建某些涉及异常处理的实际或测试 C++ 代码,以强制链接到其中一个 DLL,并查看构建的目标依赖于这些 DLL 中的哪一个(例如,在 Windows 上可以使用 Dependency Walker 查看);或
  3. 采用暴力方法,将一些测试代码编译为汇编语言(而不是机器码),查找是否存在引用,例如 ___gxx_personality_v* (DWARF)、___gxx_personality_seh* (SEH)以及 ___gxx_personality_sj* (SJLJ);详见获取当前GCC异常模型

1
有没有一种简单的方法来确定Mingw安装是DWARF/SEH/SJLJ?apt-get install mingw-w64通常会产生什么结果? - bluenote10
@bluenote10,我已经扩展了答案。 - Alexander Shukaev
1
非常感谢这些非常有用的信息!如果SO允许的话,我现在会点赞两次。 - bluenote10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接