我正在为我的一个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.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
是同一版本有关。
为什么新版本的gcc会这样做?
请参阅GCC 11的发行说明,特别是以";辅助和转储输出文件的名称和位置已更改";。
我在线阅读的所有内容都假设编译器的输出在同一源文件上运行时应该与gcov同步。我在任何地方都找不到更改覆盖范围文件的输出名称的方法。
正如发行说明中所说,-dumpbase
选项就是您想要的。要删除任何前缀,请使用-dumpbase ''
我不确定
编辑:这是预期的行为。gcov
是否应该更新,或者gcc-11的更改是否应该影响覆盖范围文件
另一个解决方案是在两个独立的步骤中编译和链接:
gcc --coverage main.c -c
gcc --coverage main.o
这样,覆盖率数据文件就不会得到前缀,gcov
会按预期找到它们。