使用mingw-w64 v12交叉编译报错,v9.3可正常编译
解决mingw-w64 v12与argtable-2.13的EOVERFLOW枚举冲突问题
核心原因
mingw-w64 v12的errno.h新增了POSIX标准的EOVERFLOW枚举定义,而argtable-2.13代码中自行定义了同名枚举,导致编译时符号冲突。旧版本v9.3的mingw-w64未包含该枚举定义,因此无冲突。
可行解决方案
1. 禁用mingw-w64的ISO C扩展定义
编译时添加-D__NO_ISOCEXT宏参数,该参数会让mingw-w64的头文件不暴露POSIX扩展的errno枚举值,和v9.3的行为对齐:
i686-w64-mingw32-gcc -D__NO_ISOCEXT [其他编译参数] your_source_files.c
如果是通过autotools构建,可在configure阶段指定:
./configure --host=i686-w64-mingw32 CFLAGS="-D__NO_ISOCEXT"
2. 重命名系统的EOVERFLOW符号
如果方案1无效,可通过编译宏将系统头文件中的EOVERFLOW重命名,避免和argtable的定义冲突:
i686-w64-mingw32-gcc -DEOVERFLOW=sys_EOVERFLOW [其他编译参数] your_source_files.c
该方法会让系统头文件中的EOVERFLOW被替换为sys_EOVERFLOW,不影响argtable自身的枚举定义。
3. 强制插入屏蔽代码(手动编译场景)
创建一个名为fix_eoverflow.h的文件,内容如下:
#define EOVERFLOW sys_EOVERFLOW #include <errno.h>
编译时通过-include参数强制在所有源文件前插入该头文件,提前屏蔽系统的EOVERFLOW定义:
i686-w64-mingw32-gcc -include fix_eoverflow.h [其他编译参数] your_source_files.c
内容的提问来源于stack exchange,提问作者rboy
相关产品推荐
相关产品推荐

