为什么Linux下的GCC不会出现“未定义的引用 `__gcov_xxx`”(而Windows下的GCC会出现)?

编程语言 2026-07-11

在Linux上:

$ echo 'void f(void){}' | gcc -xc - --coverage -fPIC -c -o x.o && gcc -shared x.o

$ gcc --version
gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0

在Windows(Cygwin)上:

$ echo 'void f(void){}' | gcc -xc - --coverage -fPIC -c -o x.o && gcc -shared x.o
/usr/lib/gcc/x86_64-pc-cygwin/13/../../../../x86_64-pc-cygwin/bin/ld: x.o:<stdin>:(.text+0x2c): undefined reference to `__gcov_init'
/usr/lib/gcc/x86_64-pc-cygwin/13/../../../../x86_64-pc-cygwin/bin/ld: x.o:<stdin>:(.text+0x40): undefined reference to `__gcov_exit'
/usr/lib/gcc/x86_64-pc-cygwin/13/../../../../x86_64-pc-cygwin/bin/ld: x.o:<stdin>:(.data+0x60): undefined reference to `__gcov_merge_add'
collect2: error: ld returned 1 exit status

$ gcc --version
gcc (GCC) 13.4.0

为什么Linux上的GCC不会产生 undefined reference to `__gcov_xxx'(而Windows上的GCC会?)

或者换句话说:为什么Windows上的GCC会产生 undefined reference to `__gcov_xxx'(而Linux上的GCC不会?)

解决方案

部分来自用户Brecht Sanders的回答(https://stackoverflow.com/a/68175407/1778275):

另外,在Windows上你不能构建带有未解析符号的共享库 (.dll) 或可执行文件 (.exe)。所谓“DLL地狱”的一部分原因是你必须确保所有符号都被解析。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章