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

use*_*935 24 linux 32-bit mingw 32bit-64bit mingw-w64

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

x86_64-w64-mingw32-g++ code.cpp -o app.exe
Run Code Online (Sandbox Code Playgroud)

这会生成一个64位的app.exe文件.

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

Ale*_*aev 32

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

奖金


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

  1. libgcc_s_dw2-1.dll (侏儒);
  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异常模型.