我第一次使用覆盖率工具 gcov 来分析一个大型项目。 我有这样的目录结构:
HW
-FooHW1.cpp
-FooHW1.h
-FooHW2.cpp
-FooHW2.h
-...
-Makefile.am
Lib1
-FooLib1.cpp
-FooLib1.h
-FooLib2.cpp
-FooLib2.h
-...
-Makefile.am
Lib2
...
-Makefile.am
Lib3
...
-Makefile.am
Main
-main.cpp
-main.h
-Makefile.am
每个目录都有自己的 Makefile,使用 automake 生成依赖项,无论使用的编译器是 c++。
由于我的目标是分析语句覆盖率,因此我尝试使用 gcov 将以下行添加到每个 Makefile.am 中以生成 .gcno 和 .gcda 文件,以便使用 gcov:
AM_CXXFLAGS = -fprofile-arcs -ftest-coverage
AM_LDFLAGS = -fprofile-arcs
不幸的是,即使它编译它也不会创建(或链接)几个 *.o 并且在调用 gcov 时它通常会给我错误:
undefined __gcov_init
我还尝试了替代,根据http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#index-coverage-536,上面的说明:
AM_CXXFLAGS = --coverage
AM_LDFLAGS = --coverage
但这对我来说没有用。
我想指出,这是第一次使用 gcov 工具以及处理大型 C++ 项目。 感谢您的帮助。
http://bobah.net/d4d/tools/code-coverage-with-gcov 和 http://www.slideshare.net/maguschen/using-gcov-and-lcov 是使用 gcov/lcov 的好资源(在这个帮助下,我成功地在非常大、复杂的项目中使用了 lcov)
lcov 使您可以以 html 格式显示覆盖结果(列出的文件甚至源文件中的行的百分比很好)。
哦,我希望您确实意识到这是一个动态覆盖,因此您必须实际运行该程序才能获得任何覆盖(构建应该只创建
.gcno
文件)。
链接库 gocv
-lgcov
这应该有帮助