我正在尝试使用 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
请注意,后一个目录中总共有 11 个 gcda 文件。build/library/obj
它不包含任何 gcda 文件build/tests/obj
。
我已经尝试从具有各种过滤器的多个目录中运行 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 文件);但是,我不太关心他们的数据是否包含在报告中。我确实需要弄清楚:
如何在执行单元测试时获取为库生成的 gcda 文件?- 我使用什么命令行来允许 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 报告失败,结果出现错误。