有多个同名源文件的问题 运行 GCOV

Trouble running GCOV with multiple source files of the same name

根据GCC online docs,gcov应该运行当前目录与调用编译器时的目录相同。假设我有以下源文件布局:

-root
   -source
      -dir1
         -file.cpp
      -dir2
         -file.cpp

I 运行 目录“root”中的 gcc 具有相应的标志(即 -fprofile-arcs、-ftest-coverage 和 –lgcov)。然后我运行生成程序。默认情况下,.gcno、.gcda 文件会在目标文件旁边生成,如下所示:

-root
   -source
      -dir1
         -file.cpp
         -file.o
         -file.gcno
         -file.gcda
      -dir2
         -file.cpp
         -file.o
         -file.gcno
         -file.gcda

是时候 运行 gcov 了。上面的在线文档要求我在同一目录“root”中 运行 gcov(我在其中 运行 gcc 构建程序)。 .gcov 覆盖文件将在当前目录下生成,该目录也是“root”。由于有两个同名文件(均为“file.cpp”),因此只会生成一个file.cpp.gcov。另一个被覆盖了。

gcov是怎么解决这个问题的?是否支持多个同名文件?

一种解决方法是使用 –p 选项 (--preserve-paths)。但是因为在我的例子中它会创建一个超长的文件名,所以我不想将它用作通用解决方案。

我很想知道是否有人可以分享一些背景知识,说明为什么 gcov 必须 运行 在调用 gcc 的同一目录中?或者 gcov 可以提供一个选项来定义这些源文件所在的位置,以便更加灵活?

由于 -p option (--preserve-paths) gcov 解决此问题的方法,他们还创建了 -s 选项(--source-prefix)来摆脱那些讨厌的长文件名。

-s directory

--source-prefix directory

A prefix for source file names to remove when generating the output coverage files. This option is useful when building in a separate directory, and the pathname to the source directory is not wanted when determining the output file names. Note that this prefix detection is applied before determining whether the source file is absolute.

我创建了一个像你上面描述的测试用例,并成功地消除了部分路径。

在你的情况下,你可以使用这个:

gcov -p -s source source/dir1/file.cpp

这意味着 gcov 不会创建名为 source#dir1#file.cpp.gcov 的文件,而是会在根目录中创建 dir1#file.cpp.gcov。

我还测试了(成功)-s 使用更长的路径名来排​​除,例如:

gcov -p -s source/someDir  source/someDir/dir1/file.cpp

因此,文件名称不是 source#someDir#dir1#file.cpp.gcov,而是 dir1#file.cpp.gcov.

这样,您仍然拥有唯一的文件名,但只是最低限度的。

此外,这个-s选项也可以多次使用(我也测试过),所以你也可以为文件取出多个ugly/long路径(例如/usr/include/c ++/4.7.2/bits/ 只得到一个名为 char_traits.h.gcov 的文件而不是 usr#include#c++#4.7.2#bits#char_traits.h.gcov).