62

我正在尝试使用 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
4

8 回答 8

80

我刚刚花费了大量的时间来调试一个非常相似的错误。这是我学到的:

  • -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 与您的编译器生成的构造函数之一(在我的情况下是复制构造函数)存在问题。检查错误消息中提到的函数,查看它复制构造的对象类型,并查看这些类中是否有任何类没有复制构造函数。添加一个,错误就会消失。

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

于 2009-05-18T19:33:42.747 回答
15

您正在寻找的标志是-lgcov 链接时。也就是说,改变:

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

gcc -lgcov AllTests.o CuTestTest.o CuTest.o -o TestTest
于 2009-02-19T21:38:37.960 回答
14

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

根据man gcc

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

于 2011-03-18T13:34:35.713 回答
13

我发现,正如这里所建议的那样,在构建包含使用 -fprofile-arcs -ftest-coverage 构建的.o 的共享库时,将 -lgcov 添加到构建行为我解决了这个问题。当然,将可执行文件与 -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 必须是最后一个链接库。

于 2010-11-03T13:36:17.410 回答
6

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

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

于 2009-02-19T19:57:11.203 回答
3

也许很明显,在与非 gcc 链接器链接时会产生这个确切的错误消息。我们在与 ifort 链接时看到此错误(因为我们的代码同时包含 Fortran 和 C 模块)。切换到与 gcc 链接就成功了。

于 2012-08-08T21:29:56.607 回答
2

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

这将解决问题。

于 2011-02-21T07:49:49.910 回答
-1

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

于 2009-02-19T21:18:37.877 回答