链接时如何解决 __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 := --coverage
或LOCAL_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 在同一版本上对齐(@987654322@、g++ --version
和 gcov --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++ 链接时