gcov符号在哪里?

时间:2009-02-19 18:06:27

标签: gcc profile 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

我似乎找不到丢失符号的位置。 gcov存在于运行gcc版本4.1.2的机器上

有什么想法吗?感谢。

开启编辑:

将gcov与包含一个.c文件的应用程序一起使用时,一切似乎都能正常工作。当我有多个.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

8 个答案:

答案 0 :(得分:73)

我花了不少时间调试一个非常相似的错误。这是我学到的东西:

  • 编译时必须传递-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遇到了一个编译器生成的构造函数(在我的例子中是一个复制构造函数)。检查错误消息中提到的函数,查看它复制构造的对象类型,并查看这些类中是否有任何类没有复制构造函数。添加一个,错误就会消失。

编辑:您是否优化也会影响这一点。如果您遇到问题,请尝试打开/关闭优化。

答案 1 :(得分:14)

您正在寻找的旗帜是-lgcov when linking。也就是说,改变:

gcc AllTests.o CuTestTest.o CuTest.o -o TestTest

gcc -lgcov AllTests.o CuTestTest.o CuTest.o -o TestTest

答案 2 :(得分:11)

编译和链接时,您应该只能在命令行中指定--coverage

根据man gcc

  

该选项是-fprofile-arcs -ftest-coverage的同义词(何时   编译)和-lgcov(链接时)。

答案 3 :(得分:10)

我发现,as suggested here,在构建包含.o的共享库时,将-lgcov添加到构建行,使用-fprofile-arcs -ftest-coverage为我解决了这个问题。当然,将可执行文件与-lgcov相关联。像这样构建共享库:

g++    -shared -o libMyLib.so src_a.o src_b.o src_c.o -lgcov

可执行文件如下:

g++ -o myExec myMain.o -lMyLib -lgcov

将-lgov添加到共享库(不仅仅是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必须是最后一个链接库。

答案 4 :(得分:5)

我尝试了一个带有gcc -ftest-coverage -fprofile-arcs test.c的简单测试文件,没有像你描述的那样的问题。

我怀疑gcc在链接时如果-ftest-coverage标志存在则会引入gcov库。尝试在gcc命令行上传递该标志。

答案 5 :(得分:2)

显然,当与非gcc链接器链接时会产生这个确切的错误消息。我们在与ifort链接时看到了这个错误(因为我们的代码包括Fortran和C模块)。切换到与gcc的链接就可以了。

答案 6 :(得分:1)

Great Max Lybbert, 基本上在autoconf使用的情况下添加_LDADD = -lgcov ...

这将解决问题。

答案 7 :(得分:-1)

所以我添加了-shared到CFLAGS,现在它似乎可以处理多个文件。当然,它在一个陌生的地方取心,所以我不知道那是什么。