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
您必须将源文件指定为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
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)
为了能够保持您的目录结构,您需要在每个源文件文件夹中运行 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)
| 归档时间: |
|
| 查看次数: |
15402 次 |
| 最近记录: |