Linux子系统下x86_64-w64-mingw32-gcc编译usrsctp无行号报错如何解决
问题定位与解决方法
第一步:确认问题根源
<command-line>开头的报错说明问题并非出自user_environment.c源码,而是编译器命令行传入的宏定义和目标平台头文件的类型定义产生了冲突。
第二步:获取更多调试信息的方法
进入报错的usrsctplib目录,手动执行编译命令并添加预处理参数,即可定位冲突的宏:
cd /mnt/c/git/usrsctp/usrsctplib # 提取报错中的gcc编译命令,添加-E(输出预处理结果)、-dD(打印所有宏定义)参数,重定向输出到文件 x86_64-w64-mingw32-gcc -E -dD -DPACKAGE_NAME=\"libusrsctp\" -DPACKAGE_TARNAME=\"libusrsctp\" -DPACKAGE_VERSION=\"0.9.5.0\" \"-DPACKAGE_STRING=\"libusrsctp 0.9.5.0\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"libusrsctp\" -DVERSION=\"0.9.5.0\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DLT_OBJDIR=\".libs/\" -DSCTP_DEBUG=1 -DINET=1 -DINET6=1 -DHAVE_STDATOMIC_H=1 -Dsocklen_t=int -I. -DSCTP_PROCESS_LEVEL_LOCKS -DSCTP_SIMPLE_ALLOCATOR -D__Userspace__ -g -O2 -std=c99 -pthread -D_GNU_SOURCE -Wno-address-of-packed-member -Werror -gdwarf-3 -pedantic -Wall -O0 -c user_environment.c > preprocess_output.txt 2>&1
打开输出的preprocess_output.txt即可查看所有宏的展开情况,定位冲突位置。
第三步:该场景的直接解决方案
这个报错的常见原因是configure脚本检测socklen_t类型时出错,在编译参数中强制添加了-Dsocklen_t=int,而mingw-w64的头文件本身已经对socklen_t做了typedef定义,宏替换后就会出现int int的重复类型声明,触发报错。
你可以直接在configure阶段添加参数跳过错误的类型检测:
# 清理之前的编译缓存 make clean # 重新执行configure,指定目标平台并告知系统已存在socklen_t类型 CC="x86_64-w64-mingw32-gcc" ./configure --host=x86_64-w64-mingw32 ac_cv_type_socklen_t=yes # 重新编译 make
内容的提问来源于stack exchange,提问作者user1511417
相关产品推荐
相关产品推荐

