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

Posted

技术标签:

【中文标题】gcov:从共享库生成 .gcda 输出?【英文标题】:gcov: producing .gcda output from shared library? 【发布时间】:2011-04-12 09:23:59 【问题描述】:

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

基本上,我的主库由多个 c++ 文件编译到一个共享库中,然后是一个名为“test”的子目录,其中包含一个链接到并测试主库的测试程序。一切都编译得很好,并且为库源文件和测试源文件生成了.gcno 文件。 .gcda 文件只是为测试源文件生成的,但对于编译到共享库中的实际源文件,我确实需要它们。

有什么想法吗?

附加信息:

都是C++代码 一切都在使用 automake 生成的 make 脚本构建 在共享库 Makefile.am 中为 lib_la_CPPFLAGS 和 lib_la_LDFLAGS 指定了 --coverage 选项 在测试可执行文件 Makefile.am 中为 AM_CPPFLAGS 和 AM_LDFLAGS 指定了 --coverage 选项 测试源文件使用 Google Test(C++ 单元测试框架)

【问题讨论】:

【参考方案1】:

我终于在 gcc 的帮助下解决了这个问题。请参阅此处的主题:http://gcc.gnu.org/ml/gcc-help/2010-09/msg00130.html

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

另外,这里有一个类似的帖子,其他人遇到了一些相同的问题:can gcov deal with shared object?。

【讨论】:

@Tom:谢谢,我很高兴这对您有所帮助。我还应该注意 gcov 有一个 -o (--object-direct) 选项,它也可以用来指定 .gcda 文件的位置。 我想知道如果我移动共享库,lib 如何知道在哪里输出 gcda 文件。命令“strings liblib.so | grep gcda”让我清楚地知道 lib 在 lib 二进制文件中有输出路径。

以上是关于gcov:从共享库生成 .gcda 输出?的主要内容,如果未能解决你的问题,请参考以下文章

可以让 gcc/gcov 将覆盖率统计信息输出到源文件夹以外的位置吗?

Libtool 为对象添加前缀,但 gcov 要求它们不带前缀

通过 CMake 生成的 TFLite 共享库不起作用

如何从共享库的文本部分获取偏移量和数据?

GCOV/LCOV,GPROF

gcov 检测共享对象引用 __gcov_init 隐藏符号