如何使用gcovr和多个源/对象目录创建覆盖率报告?

时间:2019-04-10 20:37:34

标签: c++ gcovr

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

make中运行project-root并通过调用x64/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中没有build/tests/obj包含任何gcda文件。后者的目录中总共有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中文件的覆盖率。

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

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

感谢您的帮助!

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

编辑#2:
部分奥秘得到解决。 Qt * .pro文件中的错字阻止-fprofile-arcs包含在库的链接器标志中。
我通过以下问题找到了帮助:gcov: producing .gcda output from shared library?
这导致我进入了这个gcc帮助线程:gcov support for shared library
最终让我通过运行以下命令来检查编译器在哪里保存gcda文件:

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

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

0 个答案:

没有答案
相关问题