使用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
相关产品推荐
相关产品推荐

