Linux C/C++产生覆盖率

在Linux上的c/c++开发一般都使用gcc/g++作为主要的编译器,如果需要产生覆盖率数据需要在Makefile或者Scons文件中做下面的编译链接设置:

  • 编译的时候,增加 -fprofile-arcs -ftest-coverage 或者 –coverage
  • 链接的时候,增加 -fprofile-arcs 或者 –lgcov
  • 打开–g3 选项,去掉-O2以上级别的代码优化选项,否则编译器会对代码做一些优化,例如行合并,从而影响行覆盖率结果。

Scons是一个开放源码、以Python语言编码的自动化构建工具,可用来替代make编写复杂的makefile。并且scons是跨平台的,只要scons脚本写的好,可以在Linux和Windows下随意编译。
SCons 的设计目标就是让开发人员更容易、更可靠和更快速的建造软件。
与传统的 make 工具比较,Scons 具有以下优点:

  • 使用 Python 脚本做为配置文件
  • 对于 C,C++ 和 Fortran, 内建支持可靠自动依赖分析 . 不用像 make 工具那样需要 执行"make depends"和"make clean"就可以获得所有的依赖关系。
  • 内建支持 C, C++, D, Java, Fortran, Yacc, Lex, Qt,SWIG 以及 Tex/Latex。 用户还可以根据自己的需要进行扩展以获得对需要编程语言的支持。
  • 支持 make -j 风格的并行建造。相比 make -j, SCons 可以同时运行 N 个工作,而 不用担心代码的层次结构。
  • 使用 Autoconf 风格查找头文件,函数库,函数和类型定义。
  • 良好的跨平台性。Scons 可以运行在 Linux, AIX, BSD, HP/UX, IRIX, Solaris, Windows, Mac OS X 和 OS/2 上。

基本要求就上面三点,但有一个建议,为了上述几个编译选项的使用不影响到正常的编译过程(否则会极大地影响程序的运行效率)。在使用makefile中通过参数传递来支持覆盖率产生,可以在makefile使用下面的方式:

ifeq ($(coverage), yes)
CXXFLAGS       +=  -fprofile-arcs -ftest-coverage
LINKERCXX      +=  -fprofile-arcs -ftest-coverage
OPT_FLAGS     =  -g3
endif

这样,可以使用 make coverage=yes 来引入这些编译选项而不会影响到正常的编译(scons同理)。

覆盖率产生的过程如下面三个步骤所示:

  1. 编译链接带覆盖率参数的源代码;

  2. 运行测试程序;

  3. 使用gcov获取文本形式的覆盖率数据或使用lcov获取html形式的覆盖率数据;

可以参考:https://blog.csdn.net/LU_ZHAO/article/details/104517587

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章