gcov符号在哪里?
我试图用gcov编译一个简单的应用程序,并得到以下链接错误:
gcc AllTests.o CuTestTest.o CuTest.o -o TestTest AllTests.o: In function `global constructors keyed to 0_RunAllTests': /home/p7539c/cutest/AllTests.c:26: undefined reference to `__gcov_init' AllTests.o:(.data+0x44): undefined reference to `__gcov_merge_add' CuTestTest.o: In function `global constructors keyed to 0_TestCuStringNew': /home/p7539c/cutest/CuTestTest.c:30: undefined reference to `__gcov_init' CuTestTest.o:(.data+0x64): undefined reference to `__gcov_merge_add' CuTest.o: In function `global constructors keyed to 0_CuStrAlloc': /home/p7539c/cutest/CuTest.c:379: undefined reference to `__gcov_init' CuTest.o:(.data+0x184): undefined reference to `__gcov_merge_add' collect2: ld returned 1 exit status make: *** [TestTest] Error 1 我似乎无法find丢失符号的位置。 运行gcc版本4.1.2的机器上存在gcov
有任何想法吗? 谢谢。
在编辑:
对于由一个.c文件组成的应用程序使用gcov时,似乎一切正常。 当我有多个.c文件(因此多个.o文件)我有上面的问题。
编译步骤如下所示:
 cc -fprofile-arcs -ftest-coverage -g -c -o AllTests.o AllTests.c cc -fprofile-arcs -ftest-coverage -g -c -o CuTestTest.o CuTestTest.c cc -fprofile-arcs -ftest-coverage -g -c -o CuTest.o CuTest.c 
	
我花了大量的时间debugging一个非常类似的错误。 以下是我所学到的:
-  编译时必须传递-fprofile-arcs -ftest-coverage。
-  链接时必须传递-fprofile-arcs。
- 
链接时仍然可能会出现奇怪的链接器错误。 他们看起来像这样: libname.a(objfile.o):(.ctors+0x0): undefined reference to 'global constructors keyed to long_name_of_file_and_function'
这意味着gconv与你的一个编译器生成的构造函数(在我的情况下是一个复制构造函数)有问题。 检查错误消息中提到的函数,查看它复制的对象是什么types,并查看这些类是否没有复制构造函数。 添加一个,错误将消失。
编辑:你是否优化也可以影响这一点。 尝试打开/closures优化,如果你有问题。
链接时,您正在查找的标志是-lgcov 。 也就是说,改变:
 gcc AllTests.o CuTestTest.o CuTest.o -o TestTest 
至
 gcc -lgcov AllTests.o CuTestTest.o CuTest.o -o TestTest 
 编译和链接时,应该只能在命令行上指定--coverage 。 
 根据man gcc : 
该选项是
-fprofile-arcs-ftest-coverage(编译时)和-lgcov(链接时)的-lgcov。
正如我们在这里所build议的那样 ,我发现在构build一个包含.o的共享库时使用-fprofile-arcs -ftest-coverage来为构build行添加-lgcov解决了这个问题。 当然,将可执行文件与-lgcov链接起来。 像这样构build共享库:
 g++ -shared -o libMyLib.so src_a.o src_b.o src_c.o -lgcov 
和可执行文件一样:
 g++ -o myExec myMain.o -lMyLib -lgcov 
添加-lgov到共享库的构build(不仅仅是exe),为我解决了这个额外的错误:
 hidden symbol `__gcov_merge_add' in /usr/lib/gcc/x86_64-redhat-linux/4.1.2/libgcov.a(_gcov_merge_add.o) is referenced by DSO /usr/bin/ld: final link failed: Nonrepresentable section on output 
请注意,-lgcov必须是最后一个链接的库。
 我用gcc -ftest-coverage -fprofile-arcs test.c试过了一个简单的testing文件,并没有像你描述的那样的问题。 
 我怀疑,gcc带来了gcov库,如果-ftest-coverage标志有链接。 尝试在你的gcc命令行上传递该标志。 
也许显然,这个确切的错误信息是与非gcc链接器链接时产生的。 我们在与ifort连接时看到这个错误(因为我们的代码包含Fortran和C模块)。 切换到与gcc链接做的伎俩。
伟大的最大Lybbert,基本上在autoconf使用情况下添加_LDADD = -lgcov …
这将解决这个问题。
所以我加了共享的CFLAGS,现在似乎可以处理多个文件。 当然,这是一个奇怪的地方,所以我不知道那是什么。