C++在CMake项目中使用GCOV/LCOV

Jup*_*ter 7 cmake gcov lcov

我正在使用类似于以下结构的C++项目:

---  /src
    |--comms
    |--utils
    |--interfaces
    …
    CMakeList.txt
--- /test
    |---test1/
              |--main.cpp
              |--CMakelists.txt

--CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

我确实需要控制测试的覆盖范围,为此我用这种方式使用GCOV和LCOV:

  1. 在所有CMakeLists.txt中启用coverage标志,以生成.gcno文件.

    SET(CMAKE_CXX_FLAGS "-g -O0 -Wall -fprofile-arcs -ftest-coverage")
    SET(CMAKE_C_FLAGS "-g -O0 -Wall -W -fprofile-arcs -ftest-coverage")
    SET(CMAKE_EXE_LINKER_FLAGS "-fprofile-arcs -ftest-coverage")
    
    Run Code Online (Sandbox Code Playgroud)
  2. 运行测试,生成相应的.gcda文件.

    此时,文件gcno和gcda与相应的.o文件位于同一目录中.我无法移动这些文件,因为如果我这样做,报告覆盖率生成就不起作用了.

  3. 从该文件的目录.gcno.gcda位于我做到以下几点:

    lcov –c –d . –o name.info      
    
    Run Code Online (Sandbox Code Playgroud)
  4. 使用以下方法生成HTML报告:

    genhtml  name.info.
    
    Run Code Online (Sandbox Code Playgroud)

当我编译项目时,我有重复的.gcno文件,因为在编译测试时,他们需要重新编译它们的依赖项(comms,utils,...),因为我没有为这些依赖项生成库.如果我不使用库,我认为没有办法避免这种情况.

但是,当我尝试index.html为全局项目生成(覆盖率报告)时,它不起作用.

我用我的创建项目相同的文件夹结构,并复制每一个shell脚本.gcno,并.gcda到相应的目录中.我执行命令lcovgenhtml,尽管如此,index.html 包括所有项目的覆盖范围.

我将不胜感激任何帮助.

小智 1

尝试使用--ignore-errorsgenhtml 命令,如下所示:

genhtml -o out name.info --ignore-errors source
Run Code Online (Sandbox Code Playgroud)