我试图在运行单元测试时使用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
中没有build/tests/obj
包含任何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/
所有这些(以及其他几种变体)产生相同的结果。
tests/src
中文件的覆盖率,而不报告tests/src/subdir
中文件的覆盖率。正在检测build/.../GeneratedFiles
中的cpp文件(即具有相应的gcno文件);但是,我并不十分在意报告中是否包含他们的数据。我确实需要弄清楚:
感谢您的帮助!
编辑#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报告失败,并导致错误。