59 votes

Où sont les symboles gcov?

Je suis en train de compiler une application simple avec gcov et obtenir le lien suivant erreurs:

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 qui exécute la version de gcc 4.1.2

Des idées? Merci.

Sur Modifier:

Tout semble fonctionner correctement lors de l'utilisation de gcov avec une application qui se compose d'un seul .c fichier. Quand je plusieurs .c fichiers (donc multiples .o fichiers) j'ai le problème ci-dessus.

Les étapes de compilation, ressembler à la suivante:

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

74voto

slicedlime Points 1260

Je viens de passer une quantité incroyable de temps à mettre au point un très semblable erreur. Voici ce que j'ai appris:

  • Vous devez passer -fprofile-arcs -ftest-coverage lors de la compilation.
  • Vous devez passer -fprofile-arcs lors de la liaison.
  • Vous pouvez toujours obtenir bizarre de l'éditeur de liens erreurs 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 du avoir un problème avec l'un de vos généré par le compilateur de constructeurs (dans mon cas, un constructeur par copie). De vérifier la fonction mentionné dans le message d'erreur, voir quels sont les types d'objets qu'il copie-constructions, et de voir si l'une de ces classes n'ont pas de constructeur de copie. En ajouter un, et l'erreur s'en aller.

Edit: Si oui ou non vous pouvez également optimiser l'influencent. Essayez d'allumer / éteindre les optimisations si vous rencontrez des problèmes avec elle.

14voto

Max Lybbert Points 11822

Le drapeau que vous recherchez est -lgcov lors de la création du lien . C'est le changement:

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

à

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

11voto

Ogre Psalm33 Points 4886

J'ai trouvé, comme on le suggère icique l'ajout d'-lgcov à la construction de la ligne lors de la construction d'une bibliothèque partagée qui contient .o est construit avec -fprofile-arcs -ftest-coverage résolu pour moi. Et bien sûr, reliant le fichier 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 de la sorte:

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

L'ajout de l'-lgov à la construction de la bibliothèque partagée (pas juste l'exe), 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 de liens.

11voto

Oskari Timperi Points 111

Vous devriez pouvoir spécifier simplement --coverage sur la ligne de commande lors de la compilation et de la liaison. Il devrait faire la bonne chose, au moins selon le manuel de GCC .

5voto

flodin Points 2489

J'ai essayé un fichier de test simple avec gcc -ftest-coverage -fprofile-arcs test.c et je n'ai rencontré aucun problème similaire à celui décrit.

Je soupçonne que gcc introduit la bibliothèque gcov si le drapeau -ftest-coverage est présent lors de la liaison. Essayez de passer cet indicateur sur votre ligne de commande gcc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X