如何让gcov和gcovr获取源文件和头文件

How to make gcov and gcovr pick up source and header files

我正在尝试使用 .bat 文件为项目生成覆盖率报告,详情如下。

  1. 我看到的 .gcov 文件很少。此外,当我在生成的 html 输出上单击 link 时,我无法看到文件详细信息(文件未找到错误)。我该如何解决?
  2. 执行 .bat 文件后,我看到类似“parsing coverage data for QString.h”(QT 库文件)的输出。是否符合预期?

我看过很多相关问题,但我无法弄清楚

(in report_coverage.bat)
    set GCovrpath= C:\python37\script\lib\
    set GCovpath= C:\abc\ghj\bin\
    set datafiles= C:\source\mywork\root\testing\unittests\rose\build\debug\
    set gcovr_src= C:\source\mywork\root\

    %GCovpath%gcov.exe  %datafiles% >> output.log 
     gcovr %datafiles% -s -p --html --html-details --gcov-executable %GCovpath%gcov.exe -o Test.html –verbose

这里有详细信息……

使用

编译和执行代码

QMAKE_CXXFLAGS += -fprofile-arcs -ftest-coverage

QMAKE_LFLAGS += --覆盖率 .GCNO 和 .GCDA 文件按预期生成

目录结构看似简单

 Root
     Header
           Rose
           Marigold
           Jasmin   
     Source
           Rose
           Marigold
           Jasmin   
     Testing
           UnitTests
               Rose
                  build
                       debug
               Marigold
                  build
                       debug
               Jasmin   
                  build
                       debug

谢谢。

更新: 请参阅下面的答案

如果您自己调用 gcov,则需要 运行 从执行编译器的同一目录中调用它,并且需要为其指定 gcno、gcda 或源文件的路径。 Gcov 一次只能处理一个输入文件。

当 gcov 运行s 在正确的位置时,它可以查看编译元数据以找到正确的源文件。如果出现缺少源文件的错误,则表示您没有使用正确的目录。

Gcovr 运行s gcov 自动,并具有启发式算法来找出正确的目录。但是,您仍然应该从开始编译的目录(通常是构建目录)中 运行 它。

如果不属于您的项目,gcovr 将排除覆盖率数据。如果您有单独的构建目录,则需要将 --root 参数设置为包含源代码的目录。 Gcov 处理已编译的 所有 文件的覆盖率数据,这使得 gcovr 必须进行 post 处理。

在详细模式下,gcovr 在打开 gcov 报告时会输出“Parsing coverage data for ”。然后它将使用文件中的数据来决定它是否属于您的项目,如果源代码是您项目的一部分,则输出“过滤覆盖率数据”,否则输出“排除覆盖率数据”。

覆盖率报告可能不完整的原因有多种:

  • 过滤有问题。
  • 当多个文件具有相同的名称时,Gcovr 的启发式算法可能会变得混乱,例如在不同目录中名为 util.h 的两个文件。
  • Gcovr 的 --html-details 报告包含多个 .html 文件,因此请确保它们都可用。

在您的 BAT 文件中,此调用可能效果更好:

gcovr --root ../src --print-summary --sort-percentage --html-details --gcov-executable %GCovpath%gcov.exe --output Test.html --verbose

假定以下目录结构,并且您 运行 gcovr 来自 build/:

your-project/
  src/
    Header/
      ...
    Source/
      ...
    Testing/
      ...
  build/
    ...

如果像 ../src 这样的根路径有问题,请考虑使用像 C:/path/to/the/src.

这样的绝对路径

我对 windows.

的“\”强调不够

运行 来自调试文件夹的命令(因为 test.exe 在这里)

gcov -b -l -s C:\source\mywork\root\ debug\*.gcno

运行 单元测试文件夹中的此命令(这将排除 .h 文件和包含 test 的文件)

gcovr -g -k -v  --root C:\source\mywork\root\ -e ".*\.h"    -e ".*test[_-|A-Z|a-z|0-9]*\.cpp"   --html --html-details -o report.html