当前位置:  开发笔记 > 编程语言 > 正文

gcov符号在哪里?

如何解决《gcov符号在哪里?》经验,为你挑选了5个好方法。

我正在尝试使用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与你的一个编译器生成的构造函数(在我的例子中是一个复制构造函数)有问题.检查错误消息中提到的函数,查看它复制构造的对象类型,并查看这些类中是否有任何类没有复制构造函数.添加一个,错误就会消失.

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



1> slicedlime..:

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

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

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


似乎没有必要在LDFLAGS中指定-fprofile-arcs.因为这些事情在创建目标文件时完成.您唯一需要的是在程序中链接libgcov.
这很好用.感谢您花费大量时间进行调试.

2> Max Lybbert..:

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

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

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



3> Ogre Psalm33..:

我发现,正如这里建议的那样,在构建一个包含.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必须是最后一个链接库.


我更愿意在答案中写下一个解释.无论如何,使用CMake,你可以在`target_link_libraries($ {LIBRARY_NAME} gcov)之后添加`target_link_libraries($ {LIBRARY_NAME} gcov)`.

4> 小智..:

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

根据man gcc:

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



5> flodin..:

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

我怀疑gcc在-ftest-coverage链接时是否带有gcov库.尝试在gcc命令行上传递该标志.


您仍未在最终调用gcc时传递-ftest-coverage参数.您也需要在链接时指定它.
推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有