无法使用同名的多个源文件运行GCOV

时间:2015-11-29 23:19:33

标签: c++ gcc gcov

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

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

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

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

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

gcov如何解决这个问题?它是否支持多个具有相同名称的文件?

一种解决方法是使用–p选项(--preserve-paths)。但是因为它会在我的情况下创建一个超长文件名,所以我宁愿不将它用作一般解决方案。

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

1 个答案:

答案 0 :(得分:1)

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

  

-s directory

     

- source-prefix目录

     

生成输出coverage文件时,删除的源文件名前缀。此选项在以下时非常有用   构建在单独的目录中,以及源的路径名   确定输出文件名时不需要目录。注意   在确定是否应用此前缀检测之前   源文件是绝对的。

我创建了一个如上所述的测试用例,并成功消除了部分路径。

在您的情况下,您可以使用此:

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

这意味着代替gcov创建一个名为source#dir1#file.cpp.gcov的文件,它将在root中创建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选项也可以多次使用(我也测试了这个),所以你也可以为文件取出多个丑陋/长路径(例如/usr/include/c++/4.7。 2 / bits /只获取一个名为char_traits.h.gcov的文件而不是usr #include #c ++#4.7.2#bits#char_traits.h.gcov)。