unit-testing - gcov 用于大型项目(静态库,...)

标签 unit-testing gcc build-process code-coverage gcov

我正在处理具有以下目录布局的较大项目:

Source
 MyA
  aa.cpp
  ab.cpp
  ac.cpp
 MyB
  ba.cpp
  bb.cpp
  bc.cpp
 MyTest
  testaa.cpp
  testab.cpp
  testac.cpp
  testba.cpp
  testbb.cpp
  testbc.cpp
  main.cpp
Build
 MyA
  aa.o
  ab.o
  ac.o
  libMyA.a (static library)
 MyB
  ba.o
  bb.o
  bc.o
  libMyB.a (static library)
 MyTest
  testaa.o
  testab.o
  testac.o
  testba.o
  testbb.o
  testbc.o
  MyTest (executable)

-fprofile-arcs -ftest-coverage 编译后我在 Build/MyTest 目录中执行 MyTest 应用程序。正如预期的那样,Build 目录中有 *.gcno 和 *.gcda 文件。在 MyTest 目录中运行 gcov 后,会生成不同的 *.gcov 文件,但不幸的是,MyA 和 MyB 中的所有文件都不会生成,尽管这两个库中的每个函数都被调用。尝试了不同的选项,但不知何故我无法使用此布局创建有用的(意味着正确)*.gcov 文件。

如果我将每个 cpp 复制到一个目录中并重复这些步骤,一切都会按预期进行,并且覆盖率分析是完美的。

最佳答案

  • 您必须将源文件指定为 g++/gcc 的绝对路径。不要使用带有“..”或类似“foo/bar.cpp”的相对路径,否则你会得到诸如“geninfo: WARNING: no data found for XXXX”之类的错误。
  • 不要在 g++/gcc 的命令行中包含任何头文件。否则,您将收到“图章与图形文件不匹配”错误。

  • 因此,当有多个目录时,以下应该有效:
    g++ --coverage -DDEBUG -g3 heyo.cpp /app/helper/blah.cpp /app/libfoo/foo.cpp -o program
    
    ./program
    
    lcov --directory . --capture --output-file app.info
    
    genhtml --output-directory cov_htmp app.info
    

    或者,如果你在一个已经使用相对路径的 Makefile 中,使用它很方便:
    g++ --coverage -DDEBUG -g3 $(abspath heyo.cpp helper/blah.cpp ../foo/bar/baz.cpp) -o program
    

    关于unit-testing - gcov 用于大型项目(静态库,...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5585803/

    相关文章:

    visual-studio-2010 - 如何将引用的程序集依赖项复制到 ASP.NET 输出 bin 文件夹?

    c++ - 32 位 Linux 上的 long long int 与 64 位 Linux 和 MPFR

    c - 我怎样才能弄清楚我的 C 编译器 GCC 使用的默认标准是什么?

    tfs - 项目中多个构建模板(xaml 文件)的问题

    c# - 如何模拟 System.Data.IDataReader 中的 GetValues() 方法?

    c - 如果 int (*p_arr)[10] 被定义为指向大小为 10 的数组的指针,那么为什么编译器在这种情况下会显示警告?

    build-process - 在自动构建中生成文档

    java - 使用 Mockito 测试抽象类

    android - 在 Android Studio 中构建应用程序之前自动运行测试

    ruby-on-rails - 涉及需要 api 更新的对象的 Rails 测试