C 如何防止Waf重命名对象文件?
我正在使用Waf构建一个C项目,并使用C 如何防止Waf重命名对象文件?,c,gcov,waf,C,Gcov,Waf,我正在使用Waf构建一个C项目,并使用gcov覆盖一些测试代码。但是,Waf调用gcc的方式会从源文件foo.c生成foo.c.1.o,搜索生成的文件时会混淆gcov: $ gcov foo.c $ foo.gcno:cannot open graph file 幸运的是,gcov具有-o选项,通过该选项可以指定相应的对象文件。然而,这并不方便,执行lcov仍然失败。因此,我的问题是: Waf为什么重命名对象文件 如何禁用此行为或 gcov/lcov如何解决这个问题 您是否尝试过用类似的方法修
gcov
覆盖一些测试代码。但是,Waf调用gcc
的方式会从源文件foo.c
生成foo.c.1.o
,搜索生成的文件时会混淆gcov
:
$ gcov foo.c
$ foo.gcno:cannot open graph file
幸运的是,gcov
具有-o
选项,通过该选项可以指定相应的对象文件。然而,这并不方便,执行lcov
仍然失败。因此,我的问题是:
gcov
/lcov
如何解决这个问题您是否尝试过用类似的方法修改Waf的配置
bld.program(
obj_ext = '.o',
source = 'test.c',
target = 'test1')
您可以使用而不是直接运行gcov
gcovr
不依赖文件名魔法,而是解析gcov
的覆盖范围文件。然后,它使用适当的参数调用
gcov
。这对Waf的对象文件重命名非常有效 您可以从Waf的
build
子目录运行gcovr
:
cd build
gcovr --root=$(pwd) --keep
lcov --capture --directory $(pwd) --base-directory $(pwd) --output-file coverage.info
genhtml coverage.info --output-directory out
--root
选项删除当前目录前缀--keep
选项保留gcov
的临时文件,供lcov
/genhtml
使用
您还可以使用gcovr
的--xml
选项生成兼容的xml输出。然后它可以被各种格式化程序使用(我和Jenkins一起使用)总之,从Waf的F.A.Q:
Q:foo.cpp为什么编译成foo.cpp..o数字在哪里?答:否则,相同的文件可能在不同的上下文中编译并被覆盖
,不幸的是,添加obj_ext
没有帮助。但是谢谢你告诉我FAQ中不令人满意的解释(我想知道为什么他们没有在Waf手册中包含这一重要信息)。尽管答案很清楚,但这确实很难实现。显然,gcovr的主修订版中有一个bug,导致它将--root参数的每个字符作为列表中的单独路径读取。因此,假定$(pwd)以“/”开头,它首先在整个文件系统中搜索.gcno文件和挂起。我更改了第1828行,该行调用get_datafiles来传递“[options.root]”,并使其正常工作。@flodin“[options.root]”错误在gcovr 3.2中已修复。