我正在开发具有以下目录布局的大型项目:
Source
MyA
aa.cpp
ab.cpp
ac.cpp
MyB
ba.cpp
bb.cpp
bc.cpp
MyTest
testaa.cpp
testab.cpp
testac.cpp
testba.cpp
testbb.cpp
testbc.cpp
main.cpp
Build
MyA
aa.o
ab.o
ac.o
libMyA.a (static library)
MyB
ba.o
bb.o
bc.o
libMyB.a (static library)
MyTest
testaa.o
testab.o
testac.o
testba.o
testbb.o
testbc.o
MyTest (executable)
使用-fprofile-arcs -ftest-coverage
编译后,我在Build / MyTest目录中执行MyTest应用程序。正如预期的那样,Build目录中有* .gcno和* .gcda文件。在MyTest目录中运行gcov之后会产生不同的* .gcov文件,但遗憾的是不能用于MyA和MyB中的所有内容,尽管在这两个库中调用了每个函数。尝试了不同的选项,但不知怎的,我无法用这种布局创建有用的(手段正确的)* .gcov文件。
如果我复制一个目录中的每个cpp并重复这些步骤,一切都按预期工作,覆盖率分析是完美的。
答案 0 :(得分:7)
您必须将源文件指定为g ++ / gcc的绝对路径。不要使用带有“..”或“foo / bar.cpp”的相对路径,否则你会收到类似“geninfo:警告:找不到XXXX数据”的错误。
不要在命令行中包含任何头文件到g ++ / gcc。否则,你会得到“与图形文件不匹配的图章”错误。
因此,当有多个目录时,以下应该有效:
g++ --coverage -DDEBUG -g3 heyo.cpp /app/helper/blah.cpp /app/libfoo/foo.cpp -o program
./program
lcov --directory . --capture --output-file app.info
genhtml --output-directory cov_htmp app.info
或者,如果您在使用相对路径的Makefile中,则使用起来很方便:
g++ --coverage -DDEBUG -g3 $(abspath heyo.cpp helper/blah.cpp ../foo/bar/baz.cpp) -o program
答案 1 :(得分:4)
为了能够保留您的目录结构,您需要在每个源文件文件夹中运行一次gcov,但是使用-o
选项告诉gcov数据文件的位置。
我认为应该是这样的:
gcov -o ../../Build/MyA *.cpp
我有一个具有类似源文件结构的项目,但我让编译器将对象文件等转储到源文件夹中。然后我从根文件夹多次运行gcov,每个源文件一次,但我指定了源文件的相对路径,并使用-o
选项指定相关文件夹,如下所示:
gcov -o Source/MyA Source/MyA/aa.cpp
答案 2 :(得分:-2)
如果您彻底和手动地执行了产品或应用程序测试,并且花费了很多精力。如果您的目标是使用lcov和gcov获取代码覆盖率报告,但错误地删除了gcno文件。您可以通过重新编译代码来重新生成gcno文件,但它将使用新的时间戳生成,并且gcov报告错误说“图章文件不匹配”,并且不会生成代码覆盖率报告。这将导致您的所有测试工作都被浪费。
仍有一条快捷方式可以生成代码覆盖率报告。这只是一种解决方法,不应该一直依赖。建议保留* .gcno文件,直到测试完成。
记下您的gcc版本(gcc -v)并从其中一个镜像站点下载其源代码 例如 - ftp://gd.tuwien.ac.at/gnu/sourceware/gcc/releases/gcc-4.4.6/gcc-4.4.6.tar.bz2
解压下载文件后,gcc的文件夹结构如下 GCC-4.4.6 GCC-4.4.6 / GCC
如果你直接进入gcc-4.4.6 / gcc并尝试从那里做./configure和编译(make)那么你会遇到下面的问题 build / genmodes -h> TMP-modes.h / bin / sh:build / genmodes:没有这样的文件或目录
解决方案是使用gcc-4.4.6进行./configure和make,并且不会显示与genmodes相关的错误。这将编译包括gcc在内的所有模块。如果./configure
显示任何错误,您可能必须安装gcc所需的mpfr和gmp模块转到gcc-4.4.6 / gcc / gcov.c并注释下面的行,然后用上面的命令重新编译
/* if (tag != bbg_stamp)
{
fnotice (stderr, "%s:stamp mismatch with graph file\n", da_file_name);
goto cleanup;
}*/
编译后新gcov二进制文件的示例路径为gcc-4.4.6 / host-x86_64-unknown-linux-gnu / gcc / gcov
将此二进制文件放在/ usr / bin中,并使用命令重新生成代码覆盖率报告,如下例所示 lcov --capture --directory ./ --output-file coverage.info; genhtml coverage.info --output-directory / var / www / html / coverage
现在您不应该出现“图表文件不匹配”错误,您将获得正确的代码覆盖率报告