【问题标题】:No code coverage with Mac OS X Lion and XCode 4 / llvm-g++-4.2Mac OS X Lion 和 XCode 4 / llvm-g++-4.2 没有代码覆盖
【发布时间】:2023-06-18 20:33:01
【问题描述】:

其他人报告无法generate code coverage with XCode 4,但我发现我不仅不能在 XCode 4 中执行此操作,甚至使用命令行中的简单玩具程序也无法执行此操作。我遵循了herehere 给出的示例,这导致我创建了这个 cov.c 文件:

#include <stdio.h>

int main (void) {
  int i;
  for (i = 1; i < 10; i++) {
      if (i % 3 == 0)
        printf("%d is divisible by 3\n", i);
      if (i % 11 == 0)
        printf("%d is divisible by 11\n", i);
  }
  return 0;
}

然后我使用以下命令尝试生成代码覆盖率:

g++ -c -g -O0 --coverage -o $PWD/obj/cov.o $PWD/cov.c
g++ -g -O0 --coverage -o $PWD/bin/cov $PWD/obj/*.o
$PWD/bin/cov

唉,在 obj 目录中不存在 cov.gcno 文件。实际上,在此之后我拥有的唯一文件是: 冠状病毒 对象/cov.o 垃圾箱/冠状病毒

此外,如果我输入 nm bin/cov,我会得到以下信息:

0000000100001048 S _NXArgc
0000000100001050 S _NXArgv
0000000100001060 S ___progname
0000000100000000 A __mh_execute_header
0000000100001058 S _environ
                 U _exit
0000000100000e40 T _main
                 U _printf
0000000100001000 s _pvars
                 U dyld_stub_binder
0000000100000e00 T start

这表明从未链接过 libgcov.a。如果我替换

g++ -g -O0 --coverage -o $PWD/bin/cov $PWD/obj/*.o

与:

g++ -g -O0 --coverage -o $PWD/bin/cov -lgcov $PWD/obj/*.o

我得到完全相同的结果。

更多信息:

  • g++ --version 产生:“i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (基于 Apple Inc. build 5658)(LLVM build 2336.1.00)”
  • 我也尝试过使用 gcc(即 llvm-gcc)。

【问题讨论】:

    标签: macos gcov llvm-gcc


    【解决方案1】:

    借助this answer 的帮助,我找到了这个问题的答案。基本上,我将覆盖命令更改为使用clang 而不是g++(因为示例文件是纯C,所以我使用clang 而不是clang++,我已经验证它适用于C++ 文件) .从那里,我能够使用 lcov 生成类似于我过去从 Java/cobertura 看到的输出。

    【讨论】:

      【解决方案2】:

      正如您所发现的,On Lion g++llvm-g++ 的别名。要调用“真正的”gcc,请使用 gcc-4.2g++-4.2

      g++-4.2 -g -O0 --coverage -o $PWD/bin/cov $PWD/obj/*.o
      

      【讨论】:

      • 唉,我的系统上没有 g++-4.2。但是,有 clang++,这似乎可以解决问题。