【问题标题】:CMake Gcov c++ creating wrong .gcno filesCMake Gcov c ++创建错误的.gcno文件
【发布时间】:2016-10-24 23:38:09
【问题描述】:

我有一个 CMakeLists.txt 文件,我在其中添加了:

set(CMAKE_CXX_FLAGS "-fprofile-arcs -ftest-coverage -pthread -std=c++11 -O0 ${CMAKE_CXX_FLAGS}")

它正在生成报告文件:

project_root/build/CMakeFiles/project.dir/

但它生成的文件有扩展名.cpp.gcno.cpp.gcda.cpp.o

另外,它们与 src 文件不在同一个文件夹中,它们位于:

project_root/src/ 

当我将报告文件移动到 src/ 文件夹并执行时

$ gcov main.cpp
main.gcno:cannot open notes file

但是我收到了那个错误信息。所以我将.cpp.gcno.cpp.cdnacpp.o 更改为.gcno.gcda.o,最后我得到以下信息:

gcov main.cpp
Lines executed:86.67% of 15
Creating 'main.cpp.gcov'

我有超过 50 个文件,无法为每个文件手动执行此操作。

我需要能够为所有文件运行一次 gcov 并为所有文件生成报告。我不在乎文件是在哪里生成的。

【问题讨论】:

    标签: c++ cmake gcov


    【解决方案1】:

    它正在生成报告文件:project_root/build/CMakeFiles/project.dir/

    这是为“项目”可执行文件构建所有附加文件的目录。

    但它生成的文件有扩展名 '.cpp.gcno'、'.cpp.gcda' 和 '.cpp.o'

    这是因为CMake从.cpp源创建.cpp.o目标文件(你可能会看到运行make VERBOSE=1。按照-fprofile-arcsoption's description,数据文件有后缀.cpp.gcno

    另外,它们与 src 文件不在同一个文件夹中

    数据文件与目标文件在同一目录中创建。


    实际上,如果您调用,创建的文件仍然可以工作

    gcov main.cpp.gcno
    

    来自包含.gcno 文件的目录。

    【讨论】:

    • 嗯,你是对的,它确实有效。那时我一定在其他地方测试过它。您知道一种无需逐个文件运行即可获得文件一般报告的方法吗?并且,如何避免stl文件的报告,如“stl_map.h”和我项目的头文件?
    • Do you know of a way to get a general report of the files ... - 你可能需要 lcov 实用程序。另外,您可以拨打gcov *.gcno,这样它就会一次收集目录中的所有数据文件。 how to avoid the report of stl files, like "stl_map.h" and from the header files of my project? - 我不知道这样做的简单方法。 (复杂的方法是解析 gcov 输出的中间格式并删除与标头相关的所有内容)。你可以在 Stack Overflow 上问另一个问题。
    • 谢谢,我最终在整整一代人中都使用了 lcov,虽然它仍然可以覆盖 .h 文件,但我会尽快再发帖询问。
    • "这是因为 CMake 从 .cpp 源创建 .cpp.o 目标文件" 最好能解释一下如何禁用它。
    • 我知道为什么它们仍然是目标文件的源扩展名(用于区分从不同语言的源创建的目标文件),但我不知道如何禁用它。您可以在 Stack Overflow 上创建关于此的新问题。
    【解决方案2】:

    显然,添加扩展名以提供 .cpp.o 的标准 CMake 行为可以更改为通过以下方式替换扩展名以提供 .o:

    set(CMAKE_CXX_OUTPUT_EXTENSION_REPLACE ON)
    

    【讨论】:

      最近更新 更多