I'm trying to compile a simple app with gcov and getting the following link errors:
gcc AllTests.o CuTestTest.o CuTest.o -o TestTest AllTests.o: In function `global constructors keyed to 0_RunAllTests': /home/p7539c/cutest/AllTests.c:26: undefined reference to `__gcov_init' AllTests.o:(.data+0x44): undefined reference to `__gcov_merge_add' CuTestTest.o: In function `global constructors keyed to 0_TestCuStringNew': /home/p7539c/cutest/CuTestTest.c:30: undefined reference to `__gcov_init' CuTestTest.o:(.data+0x64): undefined reference to `__gcov_merge_add' CuTest.o: In function `global constructors keyed to 0_CuStrAlloc': /home/p7539c/cutest/CuTest.c:379: undefined reference to `__gcov_init' CuTest.o:(.data+0x184): undefined reference to `__gcov_merge_add' collect2: ld returned 1 exit status make: *** [TestTest] Error 1
I can't seem to find the location of the missing symbols. gcov is present on the machine running gcc version 4.1.2
Any ideas? Thanks.
On Edit:
Everything seems to work fine when using gcov with an application that consists of one .c file. When I have multiple .c files (hence multiple .o files) I have the above problem.
The compile steps look like the following:
cc -fprofile-arcs -ftest-coverage -g -c -o AllTests.o AllTests.c cc -fprofile-arcs -ftest-coverage -g -c -o CuTestTest.o CuTestTest.c cc -fprofile-arcs -ftest-coverage -g -c -o CuTest.o CuTest.c
You can use gcov as a profiling tool to help discover where your optimization efforts will best affect your code. You can also use gcov along with the other profiling tool, gprof, to assess which parts of your code use the greatest amount of computing time. Profiling tools help you analyze your code's performance.
gcda file is generated when a program containing object files built with the GCC -fprofile-arcs option is executed. A separate . gcda file is created for each object file compiled with this option. It contains arc transition counts, and some summary information.
I just spent an incredible amount of time debugging a very similar error. Here's what I learned:
-fprofile-arcs -ftest-coverage
when compiling.-fprofile-arcs
when linking.You can still get weird linker errors when linking. They'll look like this:
libname.a(objfile.o):(.ctors+0x0): undefined reference to 'global constructors keyed to long_name_of_file_and_function'
This means that gconv's having problem with one of your compiler-generated constructors (in my case, a copy-constructor). Check the function mentioned in the error message, see what kinds of objects it copy-constructs, and see if any of those classes doesn't have a copy constructor. Add one, and the error will go away.
Edit: Whether or not you optimize can also affect this. Try turning on / switching off optimizations if you're having problems with it.
The flag you're looking for is -lgcov when linking. That is, change:
gcc AllTests.o CuTestTest.o CuTest.o -o TestTest
to
gcc -lgcov AllTests.o CuTestTest.o CuTest.o -o TestTest
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With