使用 gcvor 覆盖其他目录中的文件

Get coverage for files in other directories with gcvor

我遇到了问题,没有在 gcovr 输出中获取 cpp 文件。实际上我的主项目包含许多子 cpp 文件,但是它们位于不同的目录路径中。

目录布局:

我有一个简单的 hello world 程序,文件 main.cpphelloworld.hhelloworld.cpp 位于同一目录中。

备注:

问题:

When I create a coverage report for the hello world program, why doesn't it show the helloworld.h file?

Gcovr 仅报告包含可执行代码的文件。头文件通常只包含声明,而不包含函数定义。您可以检查 运行ning gcovr 在 `--verbose`` 模式下是否看到该文件。

一些 GCC 版本有一个错误,因此不会报告零覆盖率的文件,即使它们包含可执行代码。有关修复此问题的编译器版本,请参阅 the gcvor FAQ[1]

[1]: 抱歉,主要 gcovr.com 网站目前已关闭。

When I create a coverage report for my actual software, it shows coverage for files in the main project directory. Why doesn't it show coverage for the sub files?

Gcovr 会尝试过滤掉与您的项目无关的覆盖率数据,例如标准库的覆盖率数据。

  • Gcovr 仅在文件路径与 -f/--filter.
  • 匹配时保留覆盖率数据
  • 如果没有给出过滤器,路径必须在 -r/--root 目录中。
  • 如果没有明确提供--root,则使用当前工作目录。

因此,当您 运行 gcovr 没有像 --filter--root 这样的参数时,gcovr 将只显示当前工作目录中文件的覆盖率。

要解决此问题,请提供一个根路径,其中包含您要覆盖的所有目录,例如 --root ../--root D:/selv_ar/GCovTest/ado/cicrc_actuator_switch/ulf/src

或者,您可以提供与您感兴趣的所有文件相匹配的过滤器。请注意,过滤器是正则表达式,因此您需要转义 . 等特殊字符。此外,在正则表达式中对路径使用正斜杠。 shell 语法示例:

$ gcovr --root . \
    -f 'D:/selv_ar/GCovTest/ado/cicrc_actuator_switch/ulf/src/(test|core)/devices/puu_driver/' \
    -f 'D:/selv_ar/GCovTest/ado/cicrc_actuator_switch/ulf/src/test/testtools/'

确保您使用的是 gcovr 版本 4 或更高版本以使过滤器在 Windows 上正常工作。如果你想使用--root ../风格的路径,你应该使用gcovr 4.2(尚未发布,同时安装来自GitHub的开发版本)。

From which directory should I run gcvor? The main directory? The source directory? The workspace?

在可能的情况下,gcovr 应该 运行 在与 GCC 运行s 相同的目录中。这通常意味着您的构建目录。如果 GCC 运行s 在多个目录中,请尝试使用所有这些目录的父目录。使用 --root--filter 和搜索路径参数为源代码和 gcda 文件提供合适的路径。

Where should I put the gcda files? Into the main project directory? Into the sub file directories?

.gcda 文件必须放在编译器生成的相应 .o 目标文件和 .gcno 文件旁边。这很重要,这样才能找到正确的源文件。

如果您使用交叉编译,收集有效的覆盖率数据可能会更加复杂。如果您遇到问题,请阅读 “Cross-Profiling” chapter of the GCC docs and gcovr issue #259.

中的 GCOV_PREFIX

Gcovr 在搜索路径中搜索 gcda 文件:您传递给 gcovr 的任何(未命名)参数。例如,gcovr --root foo bar qux 指定两个搜索路径 barqux。默认情况下,gcovr 搜索当前工作目录的所有子目录。