3

我正在尝试使用 gcovr 4.1 在运行单元测试时为 C++/Qt 中的共享库项目生成覆盖率报告。我在检测我的代码时没有问题,但遇到了麻烦获取库的 gcda 文件并且也遇到问题甚至获得确实产生 gcda 文件的单元测试的完整报告。

在运行并通过调用执行单元测试后make,我的项目具有以下层次结构:project-rootx64/release/tests

project-root/
├─ Makefile
├─ build
|  ├─ library/
|  |  ├─ GeneratedFiles/
|  |  |  └─ <cpp files generated by Qt's moc compiler>
|  |  └─ obj
|  |     └─ <*.o, *.gcno, *.gcda> (gcda files show up after Edit #2)
|  └─ tests/
|     ├─ GeneratedFiles/
|     |  └─ <cpp files generated by Qt's moc compiler>
|     └─ obj
|        └─ <*.o, *.gcno, *.gcda>
├─ library/
|  ├─ Makefile
|  └─ src/
|     ├─ subdir/
|     |  └─ <source files>
|     └─ <other source files>
├─ tests/
|  ├─ Makefile
|  └─ src/
|     ├─ subdir/
|     |  └─ <source files>
|     └─ <other source files>  
└─ x64/  
   └─ release/
      ├─ tests
      └─ library.so

请注意,build/library/obj它不包含任何 gcda 文件build/tests/obj后一个目录中总共有 11 个 gcda 文件。

我已经尝试从具有各种过滤器的多个目录中运行 gcovr。一些至少产生一些输出的例子:

[user@50f886c6bdeb project-root] gcovr

尝试指定源目录:

[user@50f886c6bdeb project-root] gcovr --filter library/src/ --filter tests/src/

使用完整路径指定根:

[user@50f886c6bdeb project-root] gcovr -r /code/project-root/ --filter /code/project-root/library/src/ --filter /code/project-root/tests/src/

这些中的每一个(以及其他几个变体)都会产生相同的结果。

  • 我收到一长串“无法打开源文件”消息
  • 即使我可以通过使用 gcov 检查子目录中的 gcda 文件是否包含数据,它也会立即报告文件的覆盖率,tests/src但不会报告其中的文件。tests/src/subdir

正在检测中的 cpp 文件build/.../GeneratedFiles(即具有相应的 gcno 文件);但是,我不太关心他们的数据是否包含在报告中。我确实需要弄清楚:

  1. 如何在执行单元测试时获取为库生成的 gcda 文件?
  2. 我使用什么命令行来允许 gcovr 将该结构的结果和源配对?

我很感激任何帮助!

编辑#1:添加了 Makefile 的位置,并阐明了构建/运行二进制文件。

编辑#2:
部分谜团已解开。我的 Qt *.pro 文件中的拼写错误导致 -fprofile-arcs 无法包含在库的链接器标志中。
我通过这个问题找到了帮助:gcov:从共享库生成 .gcda 输出?
这使我进入了这个 gcc 帮助线程:gcov support for shared library
,最终让我通过运行检查编译器试图保存 gcda 文件的位置:

[user@50f886c6bdeb release]strings library.so | grep gcda

没有条目,所以我仔细检查了库的构建设置,发现了我的错误。修复后,将为库文件生成 gcda 文件,并且 gcov 可以使用它们创建报告 - 包括其中的文件library/src/subdir(与测试二进制文件的行为相矛盾)。
但是,我仍然看到所有相同的“无法打开源文件”消息。尝试构建详细的 HTML 报告失败,结果出现错误。

4

0 回答 0