在Mac OS X Lion和XCode 4 / llvm-g++-4.2中没有代码覆盖



其他人报告说不能用XCode 4生成代码覆盖,但我发现不仅不能在XCode 4中做到这一点,甚至在命令行中使用一个简单的玩具程序也做不到。我按照这里和这里给出的示例创建了这个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 3n", i);
      if (i % 11 == 0)
        printf("%d is divisible by 11n", 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

唉,没有cov。Gcno文件存在于obj目录下。事实上,在此之后我仅有的文件是:cov.cobj/cov.obin/x

此外,如果我输入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-darwin -llvm-g++-4.2 (GCC) 4.2.1(基于Apple Inc. build 5658) (LLVM build 2336.1.00)"
  • 我也试过使用gcc(这是llvm-gcc)。

我能够从这个答案中找到一个答案。基本上,我更改了覆盖命令,使用clang而不是g++(因为示例文件是纯C,我使用clang而不是clang++,我已经验证了它可以很好地与c++文件一起工作)。从那里,我能够使用lcov来生成类似于我习惯从Java/cobertura中看到的输出。

在Lion上,g++llvm-g++的别名,正如您已经发现的那样。要调用"real" gcc,请使用gcc-4.2g++-4.2:

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

最新更新