使用 cmake 配置代码覆盖率
configuring code coverage with cmake
我在一台 linux 机器上,尝试使用 cmake 构建一个项目,该项目在源代码之外构建。对于代码覆盖率,我研究了 gcov 并遵循了一个简单的教程,该教程为示例 helloWorld.cpp
程序生成了适当的文件。唯一的要求是使用 -fprofile-arcs -ftest-coverage
标志和 link 以及 -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})
所以我也包含了适当的编译时标志以及 linker 标志并正确地附加了它们。另一件需要注意的事情是 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
行,它表示可执行文件将在 bin
目录中生成。
现在除了覆盖率文件没有正确生成外,一切正常。我遵循以下步骤:
mkdir build && cd build
cmake ..
make -j4
./bin/runTest
并且 bin
文件夹中没有生成其他文件。然而,经过更多检查,我发现还有另一个位置 build/CMakeFiles/runTest.dir/test
,其中 test.cpp.o
最初位于最后一步 ./bin/runTest
之后,两个新文件 - test.cpp.gcda
& test.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++
相同,但 $PATH
中的 gcov
仍指向旧版本的 gcov
.
我在一台 linux 机器上,尝试使用 cmake 构建一个项目,该项目在源代码之外构建。对于代码覆盖率,我研究了 gcov 并遵循了一个简单的教程,该教程为示例 helloWorld.cpp
程序生成了适当的文件。唯一的要求是使用 -fprofile-arcs -ftest-coverage
标志和 link 以及 -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})
所以我也包含了适当的编译时标志以及 linker 标志并正确地附加了它们。另一件需要注意的事情是 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
行,它表示可执行文件将在 bin
目录中生成。
现在除了覆盖率文件没有正确生成外,一切正常。我遵循以下步骤:
mkdir build && cd build
cmake ..
make -j4
./bin/runTest
并且 bin
文件夹中没有生成其他文件。然而,经过更多检查,我发现还有另一个位置 build/CMakeFiles/runTest.dir/test
,其中 test.cpp.o
最初位于最后一步 ./bin/runTest
之后,两个新文件 - test.cpp.gcda
& test.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++
相同,但 $PATH
中的 gcov
仍指向旧版本的 gcov
.