编译含__gcov_dump的代码时出现未定义引用错误求助
解决__gcov_dump未定义的链接错误
核心原因:C++名字修饰导致符号不匹配
__gcov_dump是GCC提供的C语言接口函数,当用g++编译时,C编译器会对函数名进行名字修饰(Name Mangling),而libgcov库中该函数的符号是C语言格式的,因此会出现"未定义引用"的错误。即使你包含了<gcov.h>,如果头文件没有针对C编译环境添加extern "C"声明,编译器依然会按照C++规则处理这个函数名。
解决方案
方案1:给__gcov_dump添加C语言链接声明
修改代码,将<gcov.h>的包含放在extern "C"块中,或者单独声明该函数的C链接:
修改后的代码示例:
#include <stdio.h> extern "C" { #include <gcov.h> } int main() { int i, total; total = 0; for (i = 0; i < 10; i++) total += i; if (total != 45) printf ("Failure\n"); else printf ("Success\n"); __gcov_dump(); }
方案2:用gcc编译而非g++
你的代码是标准C代码,直接使用gcc编译可以避免C++名字修饰的问题:
gcc --coverage tmp.c
方案3:调整链接库顺序(若坚持用g++)
如果一定要用g++编译,确保-lgcov放在源文件之后(链接器会按顺序查找符号),不过更推荐方案1:
g++ --coverage tmp.c -lgcov
验证
编译成功后运行程序,会生成对应的.gcda文件,说明__gcov_dump已正常工作。
内容的提问来源于stack exchange,提问作者Desperado17
相关产品推荐
相关产品推荐

