使用单独的构建目录与CMake一起使用gcov

Bjo*_*ern 11 c++ cmake gcov

我很难获得gcov的覆盖信息.编译和链接期间没有错误,但是当我运行可执行文件时,不会生成任何覆盖数据.

我正在使用带有单独构建目录的CMake,以这种方式将标志传递给编译器和链接器:

add_definitions(--coverage)
set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} " --coverage")
Run Code Online (Sandbox Code Playgroud)

可执行文件是否期望源代码位于特定位置?我需要添加什么来添加到我的CMakeLists.txt才能实现目标?

亲切的问候,Bjoern

del*_*her 12

CMake似乎将代码覆盖(*.gcda,*.gcdo)文件与项目的目标文件放在一起.如果您的可执行文件名为"tester",那么它们将出现在以下路径中

${CMAKE_BINARY_DIR}/CMakeFiles/tester.dir/
Run Code Online (Sandbox Code Playgroud)

CMake似乎以与gcov不兼容的方式命名源文件.例如,如果我有一个名为"mytestprog.cpp"的源文件,它将构建

mytestprog.cpp.o
mytestprog.cpp.gcda
mytestprog.cpp.gcdno
Run Code Online (Sandbox Code Playgroud)

gcov似乎期待的地方

mytestprog.gcda
mytestprog.gcdno
Run Code Online (Sandbox Code Playgroud)

我真的不确定如何解决它.我已经尝试过使用LCov而"出现"工作,但我不确定它是否确实如此.


rob*_*ert 9

Delcypher指出了这个问题.

解决方案1:您可以要求使用未记录的开关cmake将对象文件命名为main.o而不是main.cpp.o等等CMAKE_CXX_OUTPUT_EXTENSION_REPLACE:

cmake -DCMAKE_CXX_OUTPUT_EXTENSION_REPLACE=ON ...
Run Code Online (Sandbox Code Playgroud)

解决方案2:如果您不需要.gcov可以lcov从构建目录调用的文件:

lcov --capture --directory . --output-file coverage.info
genhtml coverage.info --output-directory out
Run Code Online (Sandbox Code Playgroud)

您将out在html格式的目录中找到覆盖率信息.


ric*_*chq 3

不确定你--coverage从哪里得到的,但这些是我在 Linux 上使用 gcc 和 gcov 获取覆盖率信息的参数:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage")
set(CMAKE_EXE_LINKER_FLAGS
    "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage")
Run Code Online (Sandbox Code Playgroud)

以下是gcc --help --verbose关于这些选项的说明:

-ftest-coverage 创建“gcov”所需的数据文件

-fprofile-arcs 插入基于弧的程序分析代码

  • 使用 Clang 时,“--coverage”以较短的格式执行这两个参数的操作。 (3认同)
  • GCC 支持 `--coverage` https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html (2认同)