CMake Gcov c++创建错误的.gcno文件

11

我有一个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

此外,它们不在与源文件相同的文件夹中,源文件位于:

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,为所有文件生成报告。我不在乎文件在哪里生成。
2个回答

13
它正在生成报告文件:project_root/build/CMakeFiles/project.dir/。
这是所有附加文件为“项目”可执行文件构建的目录。
但是它生成的文件具有扩展名“.cpp.gcno”,“.cpp.gcda”和“.cpp.o”。
这是因为CMake从.cpp源文件创建.cpp.o对象文件(可以通过运行make VERBOSE =1来查看)。根据-fprofile-arcs 选项描述,数据文件具有后缀.cpp.gcno。
此外,它们不在与src文件相同的文件夹中。
数据文件是在与对象文件相同的目录中创建的。

实际上,如果您调用,创建的文件仍然有效。

gcov main.cpp.gcno

从包含 .gcno 文件的目录中。


好的,你说得对,它确实有效。我一定是在其他地方测试过了。你知道有没有一种方法可以获得文件的总体报告而不必逐个运行文件吗?还有,如何避免stl文件(例如“stl_map.h”)和我的项目头文件的报告? - fedest
你知道如何获取文件的总报告吗?可能需要使用 lcov 工具。此外,您可以调用 gcov *.gcno,这样它就会一次性收集目录中的所有数据文件。如何避免 stl 文件(例如 "stl_map.h")和我的项目头文件的报告?我不知道简单的方法来做到这一点。(复杂的方法是解析 gcov 输出的中间格式并删除与头文件相关的所有内容)。您可以在 Stack Overflow 上提出另一个关于此问题的问题。 - Tsyvarev
谢谢,我最终使用了lcov进行整个生成,尽管它仍然可以覆盖.h文件的覆盖率,但我很快会发布另一篇帖子来询问。 - fedest
这是因为 CMake 从 .cpp 源文件创建 .cpp.o 对象文件。如何禁用它的说明会很好。 - anon
我知道为什么对于目标文件仍然保留源代码扩展名(以区分从不同语言创建的源文件生成的目标文件),但我不知道如何禁用它。你可以在 Stack Overflow 上创建一个新问题来询问这件事。 - Tsyvarev

6

显然,标准的CMake行为是添加一个扩展名 .cpp.o,但可以使用以下方式更改为替换扩展名并使用 .o:

set(CMAKE_CXX_OUTPUT_EXTENSION_REPLACE ON)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接