如何解决链接时__gcov_init未定义的引用问题

How to resolve __gcov_init undefined reference issue when linking

提问人:lilingmzai 提问时间:5/22/2013 最后编辑:luizchagasjardimlilingmzai 更新时间:12/25/2022 访问量:63506

问:

我现在从事 C 代码覆盖率研究并遇到了以下问题,GCC 版本 4.4.6:

  1. 添加了编译器标志和链接器选项或并出现错误:CFLAGS = --coverageLDFLAGS := --coverageLOCAL_LDLIBS := --coverage

undefined reference to '__gcov_init'" and "undefined reference to '__gcov_merge_add'

  1. 添加了选项,并得到链接错误:LOCAL_LDFLAGS := --coverage

libgcov.a(_gcov.o): in function __gcov_set_sampling_rate: undefined reference to '__gcov_sampling_rate' libgcov.a(_gcov.o): in function gcov_exit: undefined reference to '__gcov_pmu_profile_filename' libgcov.a(_gcov.o): in function __gcov_init: undefined reference to '__gcov_pmu_profile_options' '__gcov_pmu_top_n_address'

谁能帮忙就这个问题提供一些建议?

链接器 未定义引用 GCOV

评论


答:

17赞 niglesias 6/1/2013 #1

你有链接吗?-lgcov

如果您使用的是 Makefile,那么查看它以帮助您会很有帮助。

评论

0赞 lilingmzai 7/2/2013
是的,我也尝试过 -lgcov 链接选项,但仍然遇到上述问题 1)。感谢您的回复
1赞 Spixmaster 3/14/2021
这就是我错过的。谢谢!成功了。
1赞 Gabriel Staples 5/30/2021
完善!我有一个自定义的 bash 构建脚本,其中包含用于构建的链接部分。只需像这样添加即可使其工作!gcc ${OBJECT_FILES[@]} -o "$BUILD_DIR/$PROGRAM_NAME"-lgcovgcc ${OBJECT_FILES[@]} -lgcov -o "$BUILD_DIR/$PROGRAM_NAME"
75赞 Rajen 9/13/2013 #2

请尝试以下方法:

使用以下选项编译要为其生成覆盖率的代码:

CFLAGS: -fprofile-arcs -ftest-coverage

LFLAGS: -lgcov --coverage

如果这不能解决问题,那么请提供有关应用程序结构的一些信息,即是单个程序还是涉及共享/静态库的应用程序等。

评论

2赞 Balachander Ganesan 7/9/2015
对我来说,将--coverage添加到LFLAGS解决了这个问题。以前我只对 LFLAGS 使用 -lgcov。
0赞 Zak 12/4/2017
我相信只有 Mac 上的 LLVM 编译器才需要添加。--coverageLFLAGS
1赞 kaps 7/31/2018
在 LFLAGS 中将 -lgcov 添加到 -lc 之前
1赞 Tod 3/7/2015 #3

我不确定哪个变化最终对我有用,但我认为这是旗帜。使用 GNAT GPS,我转到左侧的选项卡,然后选择顶部的选项卡。然后我启用了 .哦,是的,我发现在同一区域的选项卡上,如果您启用该复选框,它可以节省很多咬牙切齿的事情。可能会减慢专业人士的速度,但我发现它很有帮助。-fprofile-generateSwitchesAda LinkerCode CoverageBuilderRecompile if switches changed

1赞 John Gatrell 2/22/2019 #4

我发现我必须将“-lgcov”放在正在分析的对象的右侧,而不是放在 Flags 中。类似的东西。 gcc -pg -o myprog myprog.o -lgmp.a -lgcov

5赞 Ajay.kundu 2/25/2019 #5

您必须提供 LDFLAGS 才能解决此问题。

LDFLAGS += " -lgcov --coverage"
1赞 quent 11/11/2021 #6

当我尝试使用 C++ 测试工具 (CppUTest) 在 C 项目上启用覆盖率时,我对 gcov 函数 () 有未定义的引用。构建系统由 CMake 处理。undefined reference to '__gcov_exit'

编译器和 gcov 在相同的版本上对齐(并给出相同的版本),但似乎我的构建系统以前配置为使用 gcc 5,而使用 g++ 8 和 gcov 8(导致链接器包含一个额外的目录:usr/lib/gcc/x86_64-linux-gnu/5)。我清理了构建树并再次生成了它,这要归功于修复了错误的 CMake。gcc --versiong++ --versiongcov --version

1赞 Raghu 12/20/2021 #7

我也看到了这个问题,正如上面的大多数答案所表明的那样,我们需要在链接时添加lcov / gcov库。 我们正在使用cmake,并且在CmakeLists.txt文件中我们丢失了

target_link_libraries(${TARGET_NAME} PRIVATE gcov)

当然,除了构建标志“--coverage”之外,还需要这样做 (请注意,我们可以分别使用“--coverage”或“-fprofile-arcs -ftest-coverage”)