Reputation: 641
I now work on C code coverage study and encountered following issue, GCC version 4.4.6:
CFLAGS = --coverage
and linker option LDFLAGS := --coverage
or LOCAL_LDLIBS := --coverage
and got the error: undefined reference to '__gcov_init'" and "undefined reference to '__gcov_merge_add'
LOCAL_LDFLAGS := --coverage
, and got link error: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'
Can anyone help to provide some suggestions on this issue?
Upvotes: 62
Views: 72641
Reputation: 1009
Try this approach:
Compile the code for which you want to generate the coverage with these options:
CFLAGS: -fprofile-arcs -ftest-coverage
LFLAGS: -lgcov --coverage
If this doesn't solve the problem, then please provide some information on the structure of your application, i.e. whether its single program or an application involving shared/static libraries etc.
Upvotes: 81
Reputation: 11
I have seen this issue too and as most of the answers above indicated it needed us to add lcov/gcov libraries at the time of linking. We are using cmake and in CmakeLists.txt file we were missing
target_link_libraries(${TARGET_NAME} PRIVATE gcov)
This was needed of course in addition to the build flag "--coverage" (Pls note we can either use "--coverage" or "-fprofile-arcs -ftest-coverage" separately)
Upvotes: 1
Reputation: 2185
I had undefined reference to gcov functions (undefined reference to '__gcov_exit'
) while I tried to enable coverage on a C project using a C++ test harness (CppUTest). Build system was handled by CMake.
Compilers and gcov were aligned on the same version (gcc --version
, g++ --version
and gcov --version
gave the same version) but it seems that my build system was previously configured to use gcc 5 while g++ 8 and gcov 8 were used (resulting to an additional included directory by the linker: usr/lib/gcc/x86_64-linux-gnu/5). I cleaned the build tree and generated it again thanks to CMake which fixed the error.
Upvotes: 1
Reputation: 447
Are you linking with -lgcov
?
If you are using a Makefile it would be of great help to have a look at it in order to help you.
Upvotes: 17
Reputation: 305
you have to provide LDFLAGS to resolve this issue.
LDFLAGS += " -lgcov --coverage"
Upvotes: 6
Reputation: 11
I found I had to put the '-lgcov' to the right of the object being profiled instead of in Flags. Something like. gcc -pg -o myprog myprog.o -lgmp.a -lgcov
Upvotes: 1
Reputation: 8242
I can't be sure which change finally did the trick for me but I think it was the -fprofile-generate
flag. Using GNAT GPS I went to the Switches
tab on the left and then selected the Ada Linker
tab on the top. Then I enabled the checkbox for Code Coverage
. Oh yeah I've found that on the Builder
tab in that same area if you enable the Recompile if switches changed
checkbox it can save a lot of teeth-gnashing. Probably slows things down for the pros but I found it helpful.
Upvotes: 1