提问人:lilingmzai 提问时间:5/22/2013 最后编辑:luizchagasjardimlilingmzai 更新时间:12/25/2022 访问量:63506
如何解决链接时__gcov_init未定义的引用问题
How to resolve __gcov_init undefined reference issue when linking
问:
我现在从事 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'
谁能帮忙就这个问题提供一些建议?
答:
你有链接吗?-lgcov
如果您使用的是 Makefile,那么查看它以帮助您会很有帮助。
评论
gcc ${OBJECT_FILES[@]} -o "$BUILD_DIR/$PROGRAM_NAME"
-lgcov
gcc ${OBJECT_FILES[@]} -lgcov -o "$BUILD_DIR/$PROGRAM_NAME"
请尝试以下方法:
使用以下选项编译要为其生成覆盖率的代码:
CFLAGS: -fprofile-arcs -ftest-coverage
LFLAGS: -lgcov --coverage
如果这不能解决问题,那么请提供有关应用程序结构的一些信息,即是单个程序还是涉及共享/静态库的应用程序等。
评论
--coverage
LFLAGS
我不确定哪个变化最终对我有用,但我认为这是旗帜。使用 GNAT GPS,我转到左侧的选项卡,然后选择顶部的选项卡。然后我启用了 .哦,是的,我发现在同一区域的选项卡上,如果您启用该复选框,它可以节省很多咬牙切齿的事情。可能会减慢专业人士的速度,但我发现它很有帮助。-fprofile-generate
Switches
Ada Linker
Code Coverage
Builder
Recompile if switches changed
我发现我必须将“-lgcov”放在正在分析的对象的右侧,而不是放在 Flags 中。类似的东西。 gcc -pg -o myprog myprog.o -lgmp.a -lgcov
您必须提供 LDFLAGS 才能解决此问题。
LDFLAGS += " -lgcov --coverage"
当我尝试使用 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 --version
g++ --version
gcov --version
我也看到了这个问题,正如上面的大多数答案所表明的那样,我们需要在链接时添加lcov / gcov库。 我们正在使用cmake,并且在CmakeLists.txt文件中我们丢失了
target_link_libraries(${TARGET_NAME} PRIVATE gcov)
当然,除了构建标志“--coverage”之外,还需要这样做 (请注意,我们可以分别使用“--coverage”或“-fprofile-arcs -ftest-coverage”)
评论