可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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
回答1:
I just spent an incredible amount of time debugging a very similar error. Here's what I learned:
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.
回答2:
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
回答3:
You should be able to specify only --coverage
on the command line when compiling and linking.
According to man gcc
:
The option is a synonym for -fprofile-arcs
-ftest-coverage
(when
compiling) and -lgcov
(when linking).
回答4:
I found, as suggested here, that adding -lgcov to the build line when building a shared library that contains .o's built with -fprofile-arcs -ftest-coverage solved this for me. And of course linking the executable with -lgcov. Built the shared library like so:
g++ -shared -o libMyLib.so src_a.o src_b.o src_c.o -lgcov
And the executable like so:
g++ -o myExec myMain.o -lMyLib -lgcov
Adding the -lgov to the build of the shared library (not just the exe), solved this additional error for me:
hidden symbol `__gcov_merge_add' in /usr/lib/gcc/x86_64-redhat-linux/4.1.2/libgcov.a(_gcov_merge_add.o) is referenced by DSO
/usr/bin/ld: final link failed: Nonrepresentable section on output
Please note that -lgcov must be the last linked library.
回答5:
I tried a simple test file with gcc -ftest-coverage -fprofile-arcs test.c
and had no problems like you describe.
I suspect that gcc brings in the gcov library if the -ftest-coverage
flag is there when it is linking. Try passing that flag on your gcc command line.
回答6:
Perhaps obviously, this exact error message is produced when linking with a non-gcc linker. We seeing this error when linking with ifort (because our code includes both Fortran and C modules). Switching to linking with gcc did the trick.
回答7:
Great Max Lybbert,
Basically in case of autoconf usage add _LDADD = -lgcov ...
This will solve the issue.
回答8:
So I added -shared to the CFLAGS, and now it seems to work with multiple files. Of course, it's coring in a strange place, so I don't know what that's about yet.