关于大型项目的gcov(静态库,......)

azr*_*iyl 5 gcc build-process unit-testing code-coverage gcov

我正在处理具有以下目录布局的大型项目:

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)
Run Code Online (Sandbox Code Playgroud)

在编译之后,-fprofile-arcs -ftest-coverage我在Build/MyTest目录中执行MyTest应用程序.正如预期的那样,Build目录中有*.gcno和*.gcda文件.在MyTest目录中运行gcov后,会生成不同的*.gcov文件,但不幸的是,MyA和MyB中的所有文件都没有,尽管在这两个库中调用了每个函数.尝试了不同的选项,但不知怎的,我无法用这种布局创建有用的(意味着正确的)*.gcov文件.

如果我复制一个目录中的每个cpp并重复这些步骤,一切都按预期工作,覆盖率分析是完美的.

小智 7

  1. 您必须将源文件指定为g ++/gcc的绝对路径.不要使用带有".."或"foo/bar.cpp"的相对路径,否则你会收到类似"geninfo:警告:没有找到XXXX数据"的错误.

  2. 不要在命令行中包含任何头文件到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
Run Code Online (Sandbox Code Playgroud)

或者,如果您已经在使用相对路径的Makefile中,则使用起来很方便:

g++ --coverage -DDEBUG -g3 $(abspath heyo.cpp helper/blah.cpp ../foo/bar/baz.cpp) -o program
Run Code Online (Sandbox Code Playgroud)


qua*_*ana 5

为了能够保持您的目录结构,您需要在每个源文件文件夹中运行 gcov 一次,但使用该-o选项告诉 gcov 数据文件的位置。

我觉得应该是这样的:

gcov -o ../../Build/MyA *.cpp
Run Code Online (Sandbox Code Playgroud)

我有一个具有类似源文件结构的项目,但我让编译器将目标文件等转储到源文件夹中。然后我从根文件夹多次运行 gcov,每个源文件一次,但我指定源文件的相对路径并使用该-o选项指定相对文件夹,如下所示:

gcov -o Source/MyA Source/MyA/aa.cpp
Run Code Online (Sandbox Code Playgroud)