截至2022年12月,如何用Cygwin创建32位(i686)二进制文件?
在64位Windows的Cygwin64环境中生成32位(i686) DLL的问题与解决方案
问题概述
- 2022年12月及更早的相关解决方案已失效:Cygwin64官方仓库已移除
cygwin32-*系列交叉编译包,对应链接返回404。 - 当前使用Cygwin64仅能生成64位(x64)二进制文件,需生成32位DLL但遇到以下问题:
- 给
gcc添加-m32参数时,出现库不兼容报错(如跳过libgcc_s.dll.a),链接失败。 - 尝试运行32位Cygwin安装程序(
setup-x86.exe)时,64位Windows 10 22H2系统提示“32位Windows不支持Cygwin”,无法完成安装。
- 给
最小复现案例
成功的64位DLL编译命令
$ gcc -shared -o test.dll -Wl,--out-implib test.dll.a dll_test.c
失败的32位DLL编译命令
$ gcc -m32 -shared -o test.dll -Wl,--out-implib test.dll.a dll_test.c
错误信息:跳过不兼容的
libgcc_s.dll.a库,最终链接失败。
测试代码dll_test.c
int test_function(void) { return 42; }
有效解决方案(2024年适用)
Cygwin官方已放弃原生32位交叉编译支持,推荐使用MinGW-w64交叉工具链生成32位Windows DLL:
安装32位MinGW交叉编译包
打开Cygwin的setup-x86_64.exe,搜索并安装以下包:mingw64-i686-gcc-core:基础32位C编译工具- 若需C++编译支持,额外安装
mingw64-i686-gcc-g++
编译32位DLL
使用MinGW交叉编译命令替代原生gcc,无需添加-m32参数:$ i686-w64-mingw32-gcc -shared -o test_32.dll -Wl,--out-implib test_32.dll.a dll_test.c验证DLL架构
用Cygwin的file命令确认生成的是32位文件:$ file test_32.dll正确输出示例:
PE32 executable (DLL) (console) Intel 80386, for MS Windows
关键说明
- MinGW工具链生成的是原生Windows DLL,不依赖Cygwin运行时库(
cygwin1.dll),与Cygwin原生编译的DLL依赖环境不同,需根据实际需求选择。 - 若必须生成依赖32位Cygwin运行时的DLL,目前官方无支持方案,可考虑使用Docker容器运行2022年之前的旧版Cygwin进行编译。
内容的提问来源于stack exchange,提问作者xepak62241
相关产品推荐
相关产品推荐

