51

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

  1. 添加了编译器标志CFLAGS = --coverage和链接器选项LDFLAGS := --coverage,或者LOCAL_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'

任何人都可以帮助就这个问题提供一些建议吗?

4

7 回答 7

65

试试这个方法:

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

CFLAGS: -fprofile-arcs -ftest-coverage

LFLAGS: -lgcov --coverage

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

希望有帮助!

于 2013-09-13T04:09:34.543 回答
14

你在链接-lgcov吗?

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

于 2013-05-31T18:20:42.070 回答
4

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

LDFLAGS += " -lgcov --coverage"
于 2019-02-25T10:00:23.830 回答
1

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

于 2015-03-06T18:15:23.073 回答
1

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

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

于 2021-11-10T16:56:35.647 回答
1

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

于 2019-02-21T21:04:02.863 回答
0

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

target_link_libraries(${TARGET_NAME} PRIVATE gcov)

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

于 2021-12-20T14:29:02.057 回答