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

问题描述 投票:7回答:1

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

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

--CMakeLists.txt

我确实需要控制测试的覆盖范围,为此我用这种方式使用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")
  2. 运行测试,生成相应的.gcda文件。 此时,文件gcno和gcda与相应的.o文件位于同一目录中。我无法移动这些文件,因为如果我这样做,报告覆盖率生成就不起作用了。
  3. 从文件.gcno.gcda所在的目录中,我执行以下操作: lcov –c –d . –o name.info
  4. 使用以下方法生成HTML报告: genhtml name.info.

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

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

我使用Shell脚本创建项目的相同文件夹结构,并将每个.gcno.gcda复制到相应的目录。我执行命令lcovgenhtml,然而index.html不包括所有项目的覆盖范围。

我将不胜感激任何帮助。

cmake gcov lcov
1个回答
0
投票

尝试将--ignore-errors与genhtml命令放在一起:

genhtml -o out name.info --ignore-errors source
© www.soinside.com 2019 - 2024. All rights reserved.