2

我正在为我的 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,这一切都按预期工作,没有问题。但是,当使用gccwith version11.1.0时,main.gcnomain.gcda文件都有不同的名称,这会破坏流程,如下所述。

使用gcc --coverage main.c产生两个文件,a.outa-main.gcno. 然后运行可执行文件./a.out创建一个新文件a-main.gcdaa-注意覆盖文件上的前缀。运行下一个命令gcov main.c时,出现以下错误:

main.gcno:cannot open notes file
main.gcda:cannot open data file, assuming not executed

因为它正在寻找文件main.gcnomain.gcda,但找不到它们。

为什么新版gcc会这样?我在网上阅读的所有内容都假定编译器的输出应该与gcov在同一源文件上运行时同步。我找不到任何方法来更改覆盖文件的输出名称。

如果有帮助,我还注意到a-前缀取决于输出名称。因此,如果指定了输出名称 ( gcc --coverage main.c -o test),则覆盖文件将使用该名称作为前缀 (test-main.gcnotest-main.gcda)。

我也尝试过手动重命名文件以删除前缀,gcov似乎对此很满意。问题是我正在尝试自动化该过程,并且我想要一种比尝试猜测编译器用于覆盖文件的输出名称更强大的方法。

作为参考,我也在使用gcovon version 11.1.0。我不清楚这是否与gcc同一个版本有关。

4

1 回答 1

2

为什么新版本的 gcc 会这样呢?

请参阅GCC 11 的发行说明,特别是警告的第三个项目符号,其中开始“辅助和转储输出文件的命名和位置已更改”。

我在网上阅读的所有内容都假定编译器的输出在同一个源文件上运行时应该与 gcov 同步。我找不到任何方法来更改覆盖文件的输出名称。

正如发行说明中所说,该-dumpbase选项是您想要的。要删除任何前缀,请使用-dumpbase ''

我不确定是否gcov应该更新,或者 gcc-11 更改是否不应该影响覆盖文件。 编辑:符合 预期

另一种解决方案是在两个单独的步骤中编译和链接:

gcc --coverage main.c -c
gcc --coverage main.o

这样,覆盖数据文件就不会得到前缀,gcov而是按预期找到它们。

于 2022-02-24T13:38:36.710 回答