Question Où sont les symboles gcov?


J'essaie de compiler une application simple avec gcov et d'obtenir les erreurs de lien suivantes:

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

Je n'arrive pas à trouver l'emplacement des symboles manquants. gcov est présent sur la machine exécutant gcc version 4.1.2

Des idées? Merci.

Sur Modifier:

Tout semble fonctionner correctement lors de l'utilisation de gcov avec une application constituée d'un seul fichier .c. Lorsque j'ai plusieurs fichiers .c (donc plusieurs fichiers .o), j'ai le problème ci-dessus.

Les étapes de compilation ressemblent à ceci:

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

52
2018-02-19 18:06


origine


Réponses:


Je viens de passer un temps incroyable à corriger une erreur très similaire. Voici ce que j'ai appris:

  • Il faut passer -fprofile-arcs -ftest-coverage lors de la compilation.
  • Il faut passer -fprofile-arcs lors de la liaison.
  • Vous pouvez toujours obtenir des erreurs de lieur étranges lors de la liaison. Ils vont ressembler à ceci:

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

Cela signifie que gconv a un problème avec l'un de vos constructeurs générés par le compilateur (dans mon cas, un constructeur de copie). Vérifiez la fonction mentionnée dans le message d'erreur, voir quels types d'objets qu'il copie des constructions, et de voir si l'une de ces classes n'a pas un constructeur de copie. Ajoutez-en un et l'erreur disparaîtra.

Edit: si vous optimisez ou non, cela peut également affecter. Essayez d'activer / désactiver les optimisations si vous rencontrez des problèmes.


71
2018-05-18 19:33



Le drapeau que vous recherchez est -lgcov lors de la liaison. C'est à dire changer:

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

à

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

14
2018-02-19 21:38



Vous devriez pouvoir spécifier uniquement --coverage sur la ligne de commande lors de la compilation et de la liaison.

Selon man gcc:

L'option est synonyme de -fprofile-arcs  -ftest-coverage (quand   compilation) et -lgcov (lors de la liaison).


11
2018-03-18 13:34



J'ai trouvé, comme suggéré ici, Que l'ajout -lgcov à la ligne de construction lors de la construction d'une bibliothèque partagée qui contient .o est construit avec -fprofile-arcs -ftest-couverture ont résolu ce problème pour moi. Et bien sûr, lier l'exécutable avec -lgcov. Construit la bibliothèque partagée comme suit:

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

Et l'exécutable comme ça:

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

L'ajout de -lgov à la construction de la bibliothèque partagée (pas seulement l'exe) a résolu cette erreur supplémentaire pour moi:

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

Veuillez noter que -lgcov doit être la dernière bibliothèque liée.


8
2017-11-03 13:36



J'ai essayé un fichier de test simple avec gcc -ftest-coverage -fprofile-arcs test.c et n'a eu aucun problème comme vous décrivez.

Je soupçonne que gcc apporte la bibliothèque gcov si le -ftest-coverage Le drapeau est là quand il est lié. Essayez de passer cet indicateur sur votre ligne de commande gcc.


5
2018-02-19 19:57



Peut-être évidemment, ce message d'erreur exact est produit lors de la liaison avec un éditeur de liens non-gcc. Nous voyons cette erreur lors de la liaison avec ifort (car notre code inclut à la fois les modules Fortran et C). Passer à la liaison avec gcc a fait l'affaire.


2
2017-08-08 21:29



Grand Max Lybbert, Fondamentalement, en cas d'utilisation autoconf, ajoutez _LDADD = -lgcov ...

Cela résoudra le problème.


1
2018-02-21 07:49



J'ai donc ajouté -shared au CFLAGS, et maintenant il semble fonctionner avec plusieurs fichiers. Bien sûr, ça se passe dans un endroit étrange, alors je ne sais pas de quoi il s'agit.


-1
2018-02-19 21:18