使用 c++ 编译器运行 gcov 工具

Posted

技术标签:

【中文标题】使用 c++ 编译器运行 gcov 工具【英文标题】:Run gcov tool using c++ compiler 【发布时间】:2013-08-06 00:47:44 【问题描述】:

我第一次使用覆盖工具 gcov 来分析一个大型项目。 我有一个这样的目录结构:

    HW
     -FooHW1.cpp
     -FooHW1.h
     -FooHW2.cpp
     -FooHW2.h
     -...
     -Makefile.am
    Lib1
     -FooLib1.cpp
     -FooLib1.h
     -FooLib2.cpp
     -FooLib2.h
     -...
     -Makefile.am

    Lib2
     ...
     -Makefile.am
    Lib3
     ...
     -Makefile.am
    Main
     -main.cpp
     -main.h
     -Makefile.am

每个目录都有自己的 Makefile,使用 automake 生成依赖项,无论使用的编译器在哪里都是 c++。

由于我的目标是分析语句覆盖率,因此我尝试使用 gcov 在每个 Makefile.am 中添加以下行来生成我的 .gcno 和 .gcda 文件,以便使用 gcov:

    AM_CXXFLAGS = -fprofile-arcs -ftest-coverage
    AM_LDFLAGS = -fprofile-arcs

不幸的是,即使它编译它也不会创建(或链接)几个 *.o 并且在调用 gcov 时它通常会给我错误:

    undefined __gcov_init

我也试过了,根据http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#index-coverage-536,上面的指令改为:

    AM_CXXFLAGS = --coverage
    AM_LDFLAGS = --coverage

但它对我没有用。

我想说明这是第一次使用 gcov 工具和处理大型 c++ 项目。 谢谢你的帮助。

【问题讨论】:

我猜你忘了把你的代码和 lcov 链接起来。 lcov 不只是 gcov 工具的图形前端吗?我真的很缺乏经验,所以我不明白你的建议,你能更清楚吗?谢谢! 是的,我可能对此感到困惑。 AM_LDFLAGS = --coverage 应该按照我的意思去做。 我在 Makefile.am 中添加了以下内容:AM_CXXFLAGS = --coverageAM_LDFLAGS = --coverageAM_CFLAGS = -shared,它最终创建了 *gcno 文件,我无法实际测试总体原因,我遇到了一些其他问题,希望它会工作。谢谢! 您可以通过make VERBOSE=1进行调查,并查看链接标志 【参考方案1】:

链接库 gocv

-lgcov

应该有帮助

【讨论】:

【参考方案2】:

http://bobah.net/d4d/tools/code-coverage-with-gcov 和 http://www.slideshare.net/maguschen/using-gcov-and-lcov 是使用 gcov/lcov 的好来源(在这个帮助下,我设法在非常大、复杂的项目中使用 lcov)

lcov 让您可以以 html 格式显示覆盖结果(列出的文件甚至源文件中的行的百分比很好)。

哦,我希望你确实意识到这是一个动态覆盖,所以你必须实际运行程序才能获得任何覆盖(构建应该只创建 .gcno 文件)。

【讨论】:

谢谢,我知道我必须运行它才能获得我的覆盖率(这实际上是我项目的目标,以便测试移动机器人的某些模块)!看了一下 lcov 输出,它实际上比 gcov 更好,更易于理解,所以一旦我能够使其工作,我会尝试使用它,唯一的区别应该是调用它时,对吗? lcov 而不是 gcov 谢谢! 第一个链接bobah.net/d4d/tools/code-coverage-with-gcov现在是404了。

以上是关于使用 c++ 编译器运行 gcov 工具的主要内容,如果未能解决你的问题,请参考以下文章

gcov:从共享库生成 .gcda 输出?

交叉编译环境下gcov的使用

为仅标头库获取有用的 GCov 结果

gcov 与 CMake 使用单独的构建目录

为 gcov 编译 googletest

C/C++代码覆盖率工具gcovlcov