我正在为我的 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
当我gcc
在 version 上使用时10.3.0
,这一切都按预期工作,没有问题。但是,当使用gcc
with version11.1.0
时,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
似乎对此很满意。问题是我正在尝试自动化该过程,并且我想要一种比尝试猜测编译器用于覆盖文件的输出名称更强大的方法。
作为参考,我也在使用gcov
on version 11.1.0
。我不清楚这是否与gcc
同一个版本有关。