You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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下出现链接错误:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 00:27:01