使用 CMAKE 配置代码覆盖率

configuring code coverage with cmake

本文关键字:代码覆盖率 配置 CMAKE 使用      更新时间:2023-10-16

我在一台 Linux 机器上,试图使用 cmake 构建一个项目,该项目不会从源代码构建。对于代码覆盖率,我研究了 gcov 并遵循了一个简单的教程,该教程为示例helloWorld.cpp程序生成适当的文件。唯一的要求是使用 -fprofile-arcs -ftest-coverage 标志编译并使用-lgcov标志链接,这可以完全使用 -coverage 标志来完成。

现在棘手的部分来了。我有一个CMakeLists.txt机智的内容,如下所示:

cmake_minimum_required (VERSION 2.8)
project (SomeName)
SET(GCC_COVERAGE_COMPILE_FLAGS "-g -O0 -coverage -fprofile-arcs -ftest-coverage")
SET(GCC_COVERAGE_LINK_FLAGS    "-coverage -lgcov")
SET( CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}" )
SET( CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}" )
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
include_directories(include)
set(CATCH_HEADER_PATH ${PROJECT_SOURCE_DIR}/test/catch.hpp)
add_executable(runTest ${PROJECT_SOURCE_DIR}/test/test.cpp ${CATCH_HEADER_PATH}) 

因此,我也包含了适当的编译时标志以及链接器标志,并正确附加了它们。另一件需要注意的事情是set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)行,它说可执行文件将在目录中生成bin

现在一切都按预期工作,除了覆盖文件未正确生成。我遵循以下步骤:

mkdir build && cd build
cmake ..
make -j4
./bin/runTest

并且bin文件夹中不会生成其他文件。然而,在更多的检查中,我发现test.cpp.o最初驻留的另一个位置build/CMakeFiles/runTest.dir/test,在最后一步./bin/runTest之后,生成两个新文件 - test.cpp.gcdatest.cpp.gcno

我已经尝试将test/test.cpp复制到build/CMakeFiles/runTest.dir/test并运行gcov test.cpp但它无法说明 - test.gcno:cannot open notes file

gcov 和 gcc 版本中的不匹配使这种情况发生。 gcc符号链接/usr/bin/gcc被设置为最新的gcc,与g++相同,但gcov$PATH仍然指向旧版本的gcov