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

33

通过使用--coverage选项构建与共享库链接的可执行文件,能否生成gcov数据文件(.gcda文件)?

基本上,我有一个由多个C++文件编译成的主要库,编译为一个共享库,然后有一个名为“test”的子目录,其中包含链接并测试主要库的测试程序。一切都编译良好,并且针对库源文件和测试源文件都会生成.gcno文件。但是,.gcda文件仅针对测试源文件生成,而我真正需要它们的是编译到共享库中的实际源文件。

有任何想法吗?

其他信息:

  • 全部是C++代码
  • 所有内容都由automake生成的make脚本构建
  • --coverage选项在共享库Makefile.am的lib_la_CPPFLAGS和lib_la_LDFLAGS中指定
  • --coverage选项在测试可执行文件Makefile.am的AM_CPPFLAGS和AM_LDFLAGS中指定
  • 测试源文件使用Google Test(一个C++单元测试框架)
1个回答

35

我最终通过向gcc团队寻求帮助解决了这个问题。请查看这里的线程:http://gcc.gnu.org/ml/gcc-help/2010-09/msg00130.html

事实证明,.gcda文件被放在.libs目录中,因为那是共享库(.so)文件所在的位置。为了让gcov产生输出,我必须将.gcda文件移动到源文件所在的上一级。

此外,这里还有一个类似的线程,有人遇到了相同的问题:can gcov deal with shared object?


2
@Tom:谢谢,我很高兴这很有帮助。还需要注意的是,gcov 还有一个 -o(--object-direct)选项,可用于指定 .gcda 文件的位置。 - deuberger
我在想如果我移动共享库,该库如何知道输出gcda文件的位置。命令“strings liblib.so | grep gcda”让我明白该库在二进制文件中有输出路径。 - Neaţu Ovidiu Gabriel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接