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

Posted

技术标签:

【中文标题】链接时如何解决 __gcov_init 未定义的引用问题【英文标题】:How to resolve __gcov_init undefined reference issue when linking 【发布时间】:2013-05-16 23:08:18 【问题描述】:

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

    添加编译器标志CFLAGS = --coverage 和链接器选项LDFLAGS := --coverageLOCAL_LDLIBS := --coverage 并得到错误:

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

    添加选项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'

谁能帮忙提供一些关于这个问题的建议?

【问题讨论】:

【参考方案1】:

试试这个方法:

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

CFLAGS: -fprofile-arcs -ftest-coverage

LFLAGS: -lgcov --coverage

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

希望有帮助!

【讨论】:

对我来说,将 --coverage 添加到 LFLAGS 解决了这个问题。之前我只对 LFLAGS 使用 -lgcov。 我相信将--coverage 添加到LFLAGS 只是Mac 上的LLVM 编译器所必需的。 在 LFLAGS 中的 -lc 之前添加 -lgcov【参考方案2】:

你在链接-lgcov吗?

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

【讨论】:

是的,我也尝试过 -lgcov 链接选项,但仍然遇到上述问题 1)。感谢您的回复 那是我错过的。谢谢!它奏效了。 完美!我有一个自定义 bash 构建脚本,其中包含 gcc $OBJECT_FILES[@] -o "$BUILD_DIR/$PROGRAM_NAME" 用于构建的链接部分。只需像这样添加-lgcov 就可以了!:gcc $OBJECT_FILES[@] -lgcov -o "$BUILD_DIR/$PROGRAM_NAME"【参考方案3】:

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

LDFLAGS += " -lgcov --coverage"

【讨论】:

【参考方案4】:

我无法确定最终是哪个更改对我有用,但我认为是-fprofile-generate 标志。使用 GNAT GPS,我转到左侧的 Switches 选项卡,然后选择顶部的 Ada Linker 选项卡。然后我启用了Code Coverage 的复选框。哦,是的,我发现在同一区域的Builder 选项卡上,如果启用Recompile if switches changed 复选框,它可以节省很多咬牙切齿的事情。可能会减慢专业人士的速度,但我发现它很有帮助。

【讨论】:

【参考方案5】:

我发现我必须将“-lgcov”放在正在分析的对象的右侧,而不是放在标志中。就像是。 gcc -pg -o myprog myprog.o -lgmp.a -lgcov

【讨论】:

【参考方案6】:

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

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

【讨论】:

【参考方案7】:

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

target_link_libraries($TARGET_NAME PRIVATE gcov)

除了构建标志“--coverage”之外,这当然是必需的 (请注意,我们可以单独使用“--coverage”或“-fprofile-arcs -ftest-coverage”)

【讨论】:

以上是关于链接时如何解决 __gcov_init 未定义的引用问题的主要内容,如果未能解决你的问题,请参考以下文章

gcov 检测共享对象引用 __gcov_init 隐藏符号

求救!!!linux opencv 静态库 链接问题,哪位大神帮帮我?

未定义符号:__gnat_rcheck_CE_Invalid_Data 将 ADA 与 C++ 链接时

链接GLEW等,_glViewport是唯一未解决的

将犰狳 lapack blas 链接到代码时出错:未定义对“dtrsm_”的引用

如何解决 LNK2019 未解决的外部 __imp____iob_func