我正在一个 C++ 项目中工作,其结构类似于以下内容:
--- /src
|--comms
|--utils
|--interfaces
…
CMakeList.txt
--- /test
|---test1/
|--main.cpp
|--CMakelists.txt
--CMakeLists.txt
我确实需要控制测试的覆盖率,为此我以这种方式使用 GCOV 和 LCOV:
在所有 CMakeLists.txt 中启用覆盖标志以生成 .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")
运行测试,生成相应的
.gcda
文件。此时,文件 gcno 和 gcda 与对应
.o
文件位于同一目录下。我无法移动这些文件,因为如果我这样做,报告覆盖率生成将不起作用。从文件所在的目录中,
.gcno
我.gcda
执行以下操作:lcov –c –d . –o name.info
使用以下命令生成 HTML 报告:
genhtml name.info.
当我编译我的项目时,我有重复.gcno
的文件,因为在编译测试时他们需要重新编译它们的依赖项(comms,utils,...),因为我不为这些依赖项生成库。如果我不使用库,我认为没有办法避免这种情况。
但是,当我尝试index.html
为全球项目生成(覆盖率报告)时,它不起作用。
我使用一个 Shell 脚本来创建与我的项目相同的文件夹结构,并将每个文件夹结构复制.gcno
到.gcda
相应的目录中。我执行命令lcov
,genhtml
但index.html
不包括所有项目覆盖范围。
我将不胜感激任何帮助。