我正在尝试使用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
slicedlime.. 74
我只花了不少时间调试一个非常类似的错误.这是我学到的东西:
你必须-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与你的一个编译器生成的构造函数(在我的例子中是一个复制构造函数)有问题.检查错误消息中提到的函数,查看它复制构造的对象类型,并查看这些类中是否有任何类没有复制构造函数.添加一个,错误就会消失.
编辑:您是否优化也会影响这一点.如果您遇到问题,请尝试打开/关闭优化.
我只花了不少时间调试一个非常类似的错误.这是我学到的东西:
你必须-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与你的一个编译器生成的构造函数(在我的例子中是一个复制构造函数)有问题.检查错误消息中提到的函数,查看它复制构造的对象类型,并查看这些类中是否有任何类没有复制构造函数.添加一个,错误就会消失.
编辑:您是否优化也会影响这一点.如果您遇到问题,请尝试打开/关闭优化.
您正在寻找的标志是链接时的-lgcov.也就是说,改变:
gcc AllTests.o CuTestTest.o CuTest.o -o TestTest
至
gcc -lgcov AllTests.o CuTestTest.o CuTest.o -o TestTest
我发现,正如这里建议的那样,在构建一个包含.o的-fprofile-arcs -ftest-coverage构建的共享库时,将-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必须是最后一个链接库.
--coverage
编译和链接时,您应该只能在命令行上指定.
根据man gcc
:
该选项是
-fprofile-arcs
-ftest-coverage
(编译时)和-lgcov
(链接时)的同义词.
我尝试了一个简单的测试文件,gcc -ftest-coverage -fprofile-arcs test.c
没有你描述的问题.
我怀疑gcc在-ftest-coverage
链接时是否带有gcov库.尝试在gcc命令行上传递该标志.