c-在"gcc"11上,如何在使用"--coverage"时更改".g

  • 本文关键字:quot --coverage gcc c gcc code-coverage gcov gcc11
  • 更新时间 :
  • 英文 :


我正在为我的一个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时,这一切都可以正常工作,没有问题。然而,当将gcc与版本11.1.0一起使用时,main.gcnomain.gcda文件都有不同的名称,这会中断流程,如下所述。

使用gcc --coverage main.c生成两个文件,a.outa-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.gcnomain.gcda,但找不到它们。

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

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

我还尝试手动重命名文件以删除前缀,gcov似乎对此很满意。问题是,我正在尝试自动化这个过程,我想要一种比猜测编译器对覆盖文件使用什么输出名称更稳健的方法。

作为参考,我还在版本11.1.0上使用gcov。我不清楚这是否与gcc是同一版本有关。

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

请参阅GCC 11的发行说明,特别是以";辅助和转储输出文件的名称和位置已更改";。

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

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

我不确定gcov是否应该更新,或者gcc-11的更改是否应该影响覆盖范围文件 编辑:这是预期的行为。

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

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

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

相关内容

  • 没有找到相关文章

最新更新