我在这里遇到问题,在gcovr输出中没有获取cpp文件。实际上,我的主项目包含许多子cpp文件,但是它们位于不同的目录路径中。
目录布局:
D:\selv_ar\GCovTest\ado\cic\rc_actuator_switch\ulf\src
(源目录)
test\devices\puu_driver\sw
(主项目目录)core\devices\puu_driver
(子文件)test\testtools
(子文件)test\devices\puu_driver
(工作区)我有一个简单的hello world程序,其中文件main.cpp
,helloworld.h
和helloworld.cpp
位于同一目录中。
注意:
debgcov_qnx660_qcc_x86
并将gcda文件复制到与源文件相同的目录中。问题:
当我为hello world程序创建覆盖率报告时,为什么不显示helloworld.h
文件?
当我为实际软件创建覆盖率报告时,它将显示主项目目录中文件的覆盖率。为什么它不显示子文件的覆盖范围?
我应该从哪个目录运行gcvor?主目录?源目录?工作区?
我应该将gcda文件放在哪里?进入主项目目录?进入子文件目录?
答案 0 :(得分:0)
当我为hello world程序创建覆盖率报告时,为什么不显示helloworld.h文件?
Gcovr仅在文件包含可执行代码的情况下报告。头文件通常仅包含声明,但不包含函数定义。您可以通过在--verbose模式下运行gcovr来检查该文件是否可见。
某些GCC版本存在错误,因此即使包含可执行代码,也不报告覆盖率为零的文件。有关解决此问题的编译器版本,请参见the gcvor FAQ [1] 。
[1]:抱歉,当前gcovr.com主网站已关闭。
当我为我的实际软件创建一份覆盖率报告时,它将显示主项目目录中文件的覆盖率。为什么它没有显示子文件的覆盖范围?
Gcovr尝试过滤出与项目无关的coverage数据,例如标准库的coverage数据。
-f
/ --filter
匹配时,Gcovr才会保留coverage数据。-r
/ --root
目录中。--root
,则使用当前工作目录。因此,当您运行不带--filter
或--root
之类的参数的gcovr时,gcovr将仅显示当前工作目录中文件的覆盖范围。
要解决此问题,请提供一个根目录路径,其中包含要覆盖的所有目录,例如--root ../
或--root D:/selv_ar/GCovTest/ado/cicrc_actuator_switch/ulf/src
。
或者,您可以提供与所有您感兴趣的文件匹配的过滤器。请注意,过滤器是正则表达式,因此您需要转义特殊字符,例如.
。另外,对正则表达式中的路径使用正斜杠。 Shell语法示例:
$ gcovr --root . \
-f 'D:/selv_ar/GCovTest/ado/cicrc_actuator_switch/ulf/src/(test|core)/devices/puu_driver/' \
-f 'D:/selv_ar/GCovTest/ado/cicrc_actuator_switch/ulf/src/test/testtools/'
请确保您使用的是gcovr版本4或更高版本,以使过滤器在Windows上正常工作。如果要使用--root ../
样式路径,则应使用gcovr 4.2(尚未发布,同时从GitHub安装开发版本)。
我应该从哪个目录运行gcvor?主目录?源目录?工作区?
在可能的情况下,应在GCC运行所在的目录中运行gcovr。这通常意味着您的构建目录。如果GCC在多个目录中运行,请尝试使用所有这些目录的父目录。使用--root
,--filter
和搜索路径参数为源代码和gcda文件提供合适的路径。
我应该将gcda文件放在哪里?进入主项目目录?进入子文件目录?
.gcda
文件必须放置在编译器生成的相应.o
对象文件和.gcno
文件旁边。这很重要,这样才能找到正确的源文件。
如果使用交叉编译,则收集有效的覆盖率数据可能会更加复杂。如果遇到问题,请阅读“Cross-Profiling” chapter of the GCC docs和gcovr issue #259中的有关GCOV_PREFIX的信息。
Gcovr在搜索路径中搜索gcda文件:传递给gcovr的任何(未命名)参数。例如,gcovr --root foo bar qux
指定两个搜索路径bar
和qux
。默认情况下,gcovr搜索当前工作目录的所有子目录。