undefined reference to ‘_gcov_init’

问题背景

1. gcov是与gcc和g++一起工作的一个覆盖率工具,一个简单的例子如下

$ gcc -fprofile-arcs -ftest-coverage tmp.c
$ a.out
$ gcov tmp.c
  90.00% of 10 source lines executed in file tmp.c
  Creating tmp.c.gcov.

per: here

2. 将编译和链接两个步骤分开,会提示错误信息 undefined reference to ‘_gcov_init’

$ gcc -c tmp.c -fprofile-arcs -ftest-coverage
$ gcc tmp.o -o tmp 

错误信息:

tmp.c:(...): undefined reference to '__gcov_init'

tmp.o:(...): undefined reference to '__gcov_merge_add'

这和gcov的工作原理有关了

原理简介 per: here

至于其他更普遍的 "undefined reference to" error 可以顾名思义,也可以参考一个简单的例子 per: here

解决方案

在链接的时候你可以选择 a) 或 b) :

a) add -fprofile-arcs (success)

b) add -lgcov (fail, and prompt a message 'gcov: invalid option -- 'g' ')

 

$ gcc tmp.o -o tmp -fprofile-arcs

per: here

 

(已补完/已解答)

-lgcov未成功的原因?

-lgcov选项的含义?

回复来自Nathan本人,本来并没有期望9年之后邮件地址还能有效,就连他自己都说gcov都变了很多……

gcov has changed a lot since then.

邮件下半截我向Nathan询问了 -lgcov 失败的原因,这个似乎并不是 gcov command 的一个选项,Nathan回复如下:

Correct. -lgcov is an option to the compiler. IIRC -ftest-coverage -fprofile-arcs is the right invokation now.

 

意思是,-lgcov 不是 gcov 的选项,而是编译器的,在 gcc/cc/g++ 的 man-db 中看到 -lgcov 的寥寥两处,简单说明是在做覆盖率分析的代码进行 link 时候使用的

不过既然问题已经解决,-lgcov 也没有更多线索可循,也就放弃探索了

By the way, IIRC is short for If I Recall Correctly (如果我没有记错的话)

 

 

转自:https://www.cnblogs.com/turtle-fly/archive/2013/01/06/2847190.html

 

原作者若对转发有意见,请联系删除。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以按照以下步骤在imx6ull平台上使用gcov: 1. 确保您的代码能够正确地与gcov库链接 在Makefile文件中,您需要添加编译选项“-fprofile-arcs -ftest-coverage”,以启用gcov代码覆盖率分析和计数。如果您的代码中使用了一些库(例如标准C库),您需要确保这些库也能够正确地与gcov库链接。 2. 设置环境变量 在imx6ull平台上设置环境变量,以确保gcov能够正确地读取覆盖率数据。您可以在终端中运行以下命令: ``` export GCOV_PREFIX=/path/to/coverage/data/ export GCOV_PREFIX_STRIP=0 ``` 其中,/path/to/coverage/data/是您要存储覆盖率数据的路径。 3. 编译并运行测试用例 使用交叉编译工具链编译您的代码,并将可执行文件复制到imx6ull平台上运行。运行测试用例后,gcov会生成一些.gcda文件,这些文件包含了覆盖率数据。 4. 生成覆盖率报告 使用gcov工具来生成可读的报告。例如,运行“gcov your_source_file.c”将生成一个包含有关每个代码块执行次数的报告。您可以使用vim或其他文本编辑器打开报告文件进行查看。 ``` gcov your_source_file.c ``` 5. 分析报告 通过分析报告,您可以看到哪些代码块被执行,哪些未被执行,并确定测试用例的覆盖率。这样您就能够更好地了解您的代码在哪些方面需要改进。 需要注意的是,如果您的代码中包含一些特殊的硬件相关操作,例如访问外设寄存器或执行DMA传输,这些操作可能会导致gcov无法正确地计数覆盖率。在这种情况下,您需要使用其他工具进行代码分析和覆盖率分析。 希望这些步骤可以帮助您在imx6ull平台上使用gcov进行代码覆盖率分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值