C 如何防止Waf重命名对象文件?

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如何解决这个问题 您是否尝试过用类似的方法修

我正在使用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
    如何解决这个问题

  • 您是否尝试过用类似的方法修改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中已修复。