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

时间:2013-10-30 18:01:57

标签: linux mingw 32bit-64bit 32-bit mingw-w64

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

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

生成64位 app.exe 文件。

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

1 个答案:

答案 0 :(得分:30)

这取决于您当前使用的工具链的哪种变体。 DWARF SEH 变体(从GCC 4.8.0开始)都只是单目标。您可以通过检查其分发的目录结构来自己查看,即它们仅包含具有64位和32位寻址的库,但不包含两者。另一方面,普通的旧 SJLJ 分布确实是双目标,为了构建32位目标,只需提供-m32标志。如果这不起作用,那么只需使用i686-w64-mingw32-g++进行构建。

奖金


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

  1. libgcc_s_dw2-1.dll(DWARF);
  2. libgcc_s_seh-1.dll(SEH);
  3. libgcc_s_sjlj-1.dll(SJLJ)。
  4. 因此,要了解您当前的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);见Obtaining current GCC exception model