我正在为我的C项目添加代码覆盖率。 我遵循的过程如下:
# compile a .c file, expecting two new files "a.out" and "main.gcno"
gcc --coverage main.c
# run executable to get coverage data, expecting to create a new "main.gcda" file
./a.out
# use `gcov` to get formatted reports
gcov main.c
当我使用版本为10.3.0的
gcc
时,所有这些都按预期工作,没有问题。然而,当我使用版本为11.1.0的gcc
时,main.gcno
和main.gcda
文件的名称不同,这会破坏下面解释的流程。使用
gcc --coverage main.c
生成两个文件:a.out
和a-main.gcno
。然后运行可执行文件./a.out
会创建一个新文件a-main.gcda
。请注意覆盖文件上的前缀a-
。在运行下一个命令gcov main.c
时,我会得到以下错误:main.gcno:cannot open notes file
main.gcda:cannot open data file, assuming not executed
因为它正在寻找文件
main.gcno
和 main.gcda
,但是找不到这些文件。为什么新版本的
gcc
会这样做呢?我在网上阅读的所有内容都假定编译器的输出应该与同一源文件上运行的 gcov
同步。我找不到任何更改覆盖率文件的输出名称的方法。如果有帮助的话,我还注意到
a-
前缀取决于输出名称。因此,如果指定了输出名称 (gcc --coverage main.c -o test
),则覆盖率文件将具有该前缀 (test-main.gcno
和 test-main.gcda
)。我还尝试手动重命名文件以删除前缀,
gcov
似乎对此很满意。问题是,我正在尝试自动化这个过程,我需要比尝试猜测编译器用于覆盖率文件的输出名称更稳健的方法。参考资料,我也在使用版本
11.1.0
的 gcov
。我不清楚这是否与相同版本的 gcc
有关。