GCC/Linux与MinGW/Windows下弱函数表现差异求助
MinGW下弱函数链接失败问题排查
我搭建了一个测试弱函数的简单示例,该示例在Linux下运行符合预期,但在Windows(使用MinGW编译)下失败。
相关代码文件
f.h
#ifndef F_H #define F_H 1 extern int func(void); #endif
f1.c
#include "f.h" int func(void) { return 17; }
f2.c
#include "f.h" __attribute__((weak)) int func(void) { return 3; }
main.c
#include "stdio.h" #include "stdlib.h" #include "f.h" int main(int argc, char** argv) { int x = func(); printf("x is %d\n", x); return 0; }
测试情况
修改f1.c中的函数名,出现两种不同结果:
- 若函数名为
func,编译正常,main()会调用该func - 若函数名为
qfunc:- Linux下编译通过,输出
x is 3 - Windows下出现链接错误:
- Linux下编译通过,输出
c:/toolbase/mingw/comp_10.4.0_multilib_1f/bin/../lib/gcc/x86_64-w64-mingw32/10.4.0/../../../../x86_64-w64-mingw32/bin/ld.exe: main.o:main.c:(.text+0x66): undefined reference to `func' collect2.exe: error: ld returned 1 exit status
目标文件符号分析(Windows下)
执行nm命令查看目标文件符号:
f1.o的符号信息
C:\d\home\c\weak>nm f1.o 0000000000000000 b .bss 0000000000000000 d .data 0000000000000000 p .pdata 0000000000000000 r .rdata$zzz 0000000000000000 t .text 0000000000000000 r .xdata 0000000000000000 T qfunc
f2.o的符号信息
C:\d\home\c\weak>nm f2.o 0000000000000000 b .bss 0000000000000000 d .data 0000000000000000 p .pdata 0000000000000000 r .rdata$zzz 0000000000000000 t .text 0000000000000000 T .weak.func. 0000000000000000 r .xdata w func
main.o的符号信息
C:\d\home\c\weak>nm main.o 0000000000000000 b .bss 0000000000000000 d .data 0000000000000000 p .pdata 0000000000000000 r .rdata 0000000000000000 r .rdata$zzz 0000000000000000 t .text 0000000000000000 r .xdata U __imp___acrt_iob_func U __main U __mingw_vfprintf U func 0000000000000051 T main 0000000000000000 t printf
我认为链接器应该使用f2.c中标记为w的func符号。
编译命令
两个平台使用完全相同的编译命令:
gcc -c f1.c -o f1.o gcc -c f2.c -o f2.o gcc -c main.c -o main.o gcc -o asd f1.o f2.o main.o
请问该如何操作才能让它在Windows下正常工作?
内容的提问来源于stack exchange,提问作者Torsten Mohr
相关产品推荐
相关产品推荐

