其他人报告说不能用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.2
或g++-4.2
:
g++-4.2 -g -O0 --coverage -o $PWD/bin/cov $PWD/obj/*.o