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

Posted

技术标签:

【中文标题】gcov 与 CMake 使用单独的构建目录【英文标题】:gcov with CMake using a separate build directory 【发布时间】:2011-08-30 15:43:42 【问题描述】:

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

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

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

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

亲切的问候, 比约恩

【问题讨论】:

【参考方案1】:

Delcypher 指出了问题。

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

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 形式找到覆盖信息。

【讨论】:

【参考方案2】:

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

$CMAKE_BINARY_DIR/CMakeFiles/tester.dir/

CMake 似乎以一种与 gcov 不太兼容的方式命名源文件。例如,如果我有一个名为“mytestprog.cpp”的源文件,它将是 build

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

gcov 预期的地方

mytestprog.gcda
mytestprog.gcdno

我不确定如何解决它。我已经尝试使用 LCov 并且“似乎”可以工作,但我不确定是否可以。

【讨论】:

由于某种原因,您可以通过仅指定目标文件并将虚假值作为源文件传递来获取配置文件信息。例如:gcov -o mytestprog.cpp.o x 将产生 mytestprog.cpp.gcov @bcmpinc 但它无法检查您在该文件中使用的标头。【参考方案3】:

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

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

nm name_of_binary | grep "gcov"

如果它被链接,则 gcov 可能没有权限将文件写入您正在运行可执行文件的位置。如果它有权限,那我就难住了。

【讨论】:

【参考方案4】:

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

【讨论】:

当使用 Clang 时,--coverage 以较短的格式执行这两个参数的作用。 GCC 支持--coverage gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html

以上是关于gcov 与 CMake 使用单独的构建目录的主要内容,如果未能解决你的问题,请参考以下文章

CMake添加gcov代码覆盖测试支持

CMake--静态库与动态库构建

gcov:从共享库生成 .gcda 输出?

cmake的外部编译

CMake 多配置生成器使用错误的构建目录

在 CMake 中具有依赖关系的自定义对象