根据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可以提供一个选项来定义这些源文件的位置,以便更灵活?
答案 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)。