链接时如何解决__gcov_init未定义参考问题

问题描述 投票:37回答:5

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

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

任何人都可以提供有关此问题的建议吗?

linker undefined-reference gcov
5个回答
48
投票

尝试这种方法:

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

CFLAGS: -fprofile-arcs -ftest-coverage

LFLAGS: -lgcov --coverage

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

希望有帮助!


10
投票

您是否与-lgcov链接?如果您使用的是Makefile,请仔细阅读该文件以对您有很大的帮助。


1
投票

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


1
投票

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


0
投票

我不确定哪个更改最终对我有用,但我认为这是-fprofile-generate标志。使用GNAT GPS,我转到了左侧的Switches标签,然后选择了顶部的Ada Linker标签。然后,我启用了Code Coverage的复选框。哦,是的,我发现在同一区域的Builder选项卡上,如果启用Recompile if switches changed复选框,则可以省去很多麻烦。可能会使专业人士放慢脚步,但我发现这很有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.