使用cmakeconfiguration代码覆盖率

我在一台linux机器上,试图使用cmake来构build一个没有源代码的项目。 对于代码覆盖范围,我查看了gcov,然后使用了一个简单的教程,为示例helloWorld.cpp程序生成相应的文件。 唯一的要求是用-fprofile-arcs -ftest-coverage标志和带-lgcov标志的链接进行-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文件夹内不会生成其他文件。 但更多的检查,我发现有另一个位置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 symlink /usr/bin/gcc被设置为最新的gcc ,与g++相同,但$PATH中的gcov仍然指向旧版本的gcov