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

时间:2011-05-22 16:11:31

标签: c++ cmake gcov

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

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

add_definitions(--coverage)
set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} " --coverage")

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

亲切的问候, 比约恩

4 个答案:

答案 0 :(得分:12)

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

${CMAKE_BINARY_DIR}/CMakeFiles/tester.dir/

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

mytestprog.cpp.o
mytestprog.cpp.gcda
mytestprog.cpp.gcdno

gcov似乎期待

mytestprog.gcda
mytestprog.gcdno

我不确定如何修复它。我尝试过使用LCov而且#34;出现了#34;工作,但我不确定它是否确实。

答案 1 :(得分:8)

Delcypher指出了这个问题。

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

cmake -DCMAKE_CXX_OUTPUT_EXTENSION_REPLACE=ON ...

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

lcov --capture --directory . --output-file coverage.info
genhtml coverage.info --output-directory out

您将在html表单的out目录中找到覆盖率信息。

答案 2 :(得分: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")

以下是gcc --help --verbose对这些选项的评价:

  

-ftest-coverage创建   “gcov”

所需的数据文件      

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

答案 3 :(得分:0)

您无需将--coverage传递给链接器。 --coverage会将-fprofile-arcs -ftest-coverage传递给编译器,将-lgcov传递给链接器。

您确定它没有创建任何gcdo或gcda文件吗?你在哪里寻找这些文件?它应该将每个目标文件的gcov文件放在与目标文件相同的目录中。在构建目录的顶部找到.gcda文件。如果没有显示任何内容,gcov可能无法链接。运行以下命令以查看它是否:

nm name_of_binary | grep "gcov"

如果它被链接,那么gcov可能没有权限将文件写入运行可执行文件的位置。如果它有权限,那么我很难过。