我在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
文件夹中没有生成其他文件。但是,经过更多检查,我发现还有另一个位置 build/CMakeFiles/runTest.dir/test
,其中test.cpp.o
最初位于最后一步./bin/runTest
之后,有两个新文件 - {{1 }&生成test.cpp.gcda
。
我已经尝试将test.cpp.gcno
复制到 test/test.cpp
并运行build/CMakeFiles/runTest.dir/test
,但未能说明 - gcov test.cpp
答案 0 :(得分:1)
gcov和gcc版本的不匹配使这种情况发生。 gcc
符号链接/usr/bin/gcc
设置为最新gcc
,g++
相同,但gcov
中的$PATH
仍然指向{{1}的旧版本}}