You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用mingw-w64+CMake构建32/64位Windows DLL时32位链接报错如何解决

问题根本原因

你当前使用的是x86_64架构的MinGW工具链,虽然给编译、链接参数加了-m32,但链接器默认加载的crt启动文件仍是工具链自带的64位版本,手动添加的32位库搜索路径不会覆盖链接器对crt启动文件的默认查找逻辑,因此出现架构不兼容报错。

解决方案

方案一(推荐):使用两套独立工具链分别构建

这是MinGW官方推荐的跨架构构建方式,完全避免路径冲突,不需要手动修改库搜索路径。

前置准备

确保MSYS2中已安装32位MinGW工具链,在MSYS2终端执行:

pacman -S mingw-w64-i686-gcc mingw-w64-i686-cmake mingw-w64-i686-make

简化CMake配置

无需在配置中区分32/64位目标,通用配置如下即可:

ADD_LIBRARY(mylib SHARED mylib.c)
SET_TARGET_PROPERTIES(mylib PROPERTIES PREFIX "")
target_link_options(mylib PUBLIC -Wl,--exclude-all-symbols -s -Wl,--gc-sections -Wl,-Map=output.map )

64位构建步骤

打开「MinGW64」终端,执行:

mkdir build64 && cd build64
cmake .. -G "MinGW Makefiles"
mingw32-make -j

32位构建步骤

打开「MinGW32」终端,执行:

mkdir build32 && cd build32
cmake .. -G "MinGW Makefiles"
mingw32-make -j

方案二:单工具链同配置同时构建32/64位版本

如果必须在同一份CMake配置、同个构建环境中同时生成两个架构的产物,需要手动指定32位crt启动文件路径、强制链接器生成32位PE文件,修正后的32位目标配置如下:

#32Bit 修复后配置
ADD_LIBRARY(mylib32 SHARED mylib.c)
SET_TARGET_PROPERTIES(mylib32 PROPERTIES 
  PREFIX "" 
  COMPILE_FLAGS "-m32" 
  LINK_FLAGS "-m32 -Wl,-m,i386pe"
)
target_link_options(mylib32 PUBLIC 
  # 强制指定32位crt启动文件,覆盖链接器默认的64位crt
  /msys64/mingw32/i686-w64-mingw32/lib/dllcrt2.o
  /msys64/mingw32/lib/gcc/i686-w64-mingw32/10.3.0/crtbegin.o
  --verbose 
  -Wl,--exclude-all-symbols 
  -s 
  -Wl,--gc-sections 
  # 单独命名32位的map文件,避免和64位产物冲突
  -Wl,-Map=output32.map
  -L/msys64/mingw32/lib 
  -L/msys64/mingw32/i686-w64-mingw32/lib 
  -L/msys64/mingw32/lib/gcc/i686-w64-mingw32/10.3.0
  /msys64/mingw32/lib/gcc/i686-w64-mingw32/10.3.0/crtend.o
)

内容的提问来源于stack exchange,提问作者nop_0x00

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 04:54:03