16

我正在努力获取 gcov 的覆盖信息。编译和链接期间没有错误,但是当我运行可执行文件时,没有生成覆盖数据。

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

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

可执行文件是否期望源代码位于特定位置?我必须在我的 CMakeLists.txt 中添加什么才能让事情顺利进行?

亲切的问候,比约恩

4

4 回答 4

16

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 并且“似乎”可以工作,但我不确定是否可以。

于 2012-02-23T00:34:51.540 回答
13

Delcypher 指出了问题所在。

解决方案 1:您可以要求使用未记录的开关cmake将目标文件命名main.o为等:main.cpp.oCMAKE_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

out您将在 html 形式的目录中找到覆盖信息。

于 2016-10-18T14:19:39.083 回答
2

不知道你从哪里得到--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 插入基于弧的程序分析代码

于 2011-05-22T19:14:33.513 回答
1

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

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

nm name_of_binary | grep "gcov"

如果它被链接,则 gcov 可能无权将文件写入您正在运行可执行文件的位置。如果它有许可,那么我很难过。

于 2011-05-23T15:08:33.560 回答