Где находятся символы gcov? - PullRequest
57 голосов
/ 19 февраля 2009

Я пытаюсь скомпилировать простое приложение с gcov и получаю следующие ошибки ссылки:

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

Я не могу найти местоположение пропущенных символов. gcov присутствует на машине под управлением gcc версии 4.1.2

Есть идеи? Спасибо.

При редактировании:

Кажется, что все работает нормально при использовании gcov с приложением, которое состоит из одного файла .c. Когда у меня есть несколько файлов .c (следовательно, несколько файлов .o), у меня возникает вышеуказанная проблема.

Шаги компиляции выглядят следующим образом:

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

Ответы [ 8 ]

74 голосов
/ 18 мая 2009

Я потратил невероятное количество времени на отладку очень похожей ошибки. Вот что я узнал:

  • Вы должны передать -fprofile-arcs -ftest-coverage при компиляции.
  • Вы должны передать -fprofile-arcs при связывании.
  • Вы все еще можете получить странные ошибки компоновщика при компоновке. Они будут выглядеть так:

    libname.a(objfile.o):(.ctors+0x0): undefined reference to 'global constructors keyed to long_name_of_file_and_function'

Это означает, что у gconv есть проблема с одним из ваших сгенерированных компилятором конструкторов (в моем случае, конструктор копирования). Проверьте функцию, упомянутую в сообщении об ошибке, посмотрите, какие объекты она копирует, и посмотрите, не имеет ли какой-либо из этих классов конструктор копирования. Добавьте один, и ошибка исчезнет.

Редактировать: может ли это повлиять на оптимизацию или нет. Попробуйте включить / выключить оптимизацию, если у вас возникли проблемы с ним.

14 голосов
/ 20 февраля 2009

Флаг, который вы ищете, это -lgcov при связывании . То есть изменить:

gcc AllTests.o CuTestTest.o CuTest.o -o TestTest

до

gcc -lgcov AllTests.o CuTestTest.o CuTest.o -o TestTest
11 голосов
/ 18 марта 2011

Вы должны иметь возможность указать только --coverage в командной строке при компиляции и компоновке.

Согласно man gcc:

Опция является синонимом -fprofile-arcs -ftest-coverage (когда компиляция) и -lgcov (при связывании).

10 голосов
/ 03 ноября 2010

Я обнаружил, , как предложено здесь , что добавление -lgcov к строке сборки при создании разделяемой библиотеки, содержащей сборку .o с -fprofile-arcs -ftest-покрытие, решило эту проблему для меня. И, конечно же, связывание исполняемого файла с -lgcov. Построил разделяемую библиотеку так:

g++    -shared -o libMyLib.so src_a.o src_b.o src_c.o -lgcov

И исполняемый файл выглядит так:

g++ -o myExec myMain.o -lMyLib -lgcov

Добавление -lgov в сборку разделяемой библиотеки (не только exe) решило эту дополнительную ошибку для меня:

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

Обратите внимание, что -lgcov должен быть последней связанной библиотекой.

5 голосов
/ 19 февраля 2009

Я попробовал простой тестовый файл с gcc -ftest-coverage -fprofile-arcs test.c, и у меня не было проблем, как вы описали.

Я подозреваю, что gcc вводит библиотеку gcov, если при связывании присутствует флаг -ftest-coverage. Попробуйте передать этот флаг в командной строке gcc.

2 голосов
/ 09 августа 2012

Возможно, очевидно, что это точное сообщение об ошибке выдается при компоновке с компоновщиком не-gcc. Мы видим эту ошибку при соединении с ifort (потому что наш код включает в себя модули Fortran и C). Переход на соединение с gcc сделал свое дело.

1 голос
/ 21 февраля 2011

Великий Макс Либберт, В основном, в случае использования autoconf добавьте _LDADD = -lgcov ...

Это решит проблему.

0 голосов
/ 20 февраля 2009

Итак, я добавил -shared к CFLAGS, и теперь он работает с несколькими файлами. Конечно, это происходит в странном месте, поэтому я пока не знаю, о чем это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...