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.
Lors de l'édition:
Tout semble bien fonctionner lorsque vous utilisez gcov avec une application qui se compose d'un 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
Je viens de passer un temps incroyable à déboguer une erreur très similaire. Voici ce que j'ai appris:
-fprofile-arcs -ftest-coverage
Lors de la compilation.-fprofile-arcs
Lors de la liaison.Vous pouvez toujours obtenir des erreurs de l'éditeur de liens étranges lors de la liaison. Ils ressembleront à 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, voyez quels types d'objets il copie-construit et voyez si l'une de ces classes n'a pas de constructeur de copie. Ajoutez-en un et l'erreur disparaîtra.
Modifier: Que vous optimisiez ou non peut également affecter cela. Essayez d'activer/désactiver les optimisations en cas de problème.
Le drapeau que vous recherchez est - lgcov lors de la liaison . Autrement dit, changez:
gcc AllTests.o CuTestTest.o CuTest.o -o TestTest
à
gcc -lgcov AllTests.o CuTestTest.o CuTest.o -o TestTest
J'ai trouvé, comme suggéré ici , que l'ajout de -lgcov à la ligne de construction lors de la construction d'une bibliothèque partagée contenant des .o construits avec -fprofile-arcs -ftest-coverage a résolu cela pour moi. Et bien sûr, relier l'exécutable à -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.
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
(lors de la compilation) et-lgcov
(lors de la liaison).
J'ai essayé un simple fichier de test avec gcc -ftest-coverage -fprofile-arcs test.c
et n'a eu aucun problème comme vous le décrivez.
Je soupçonne que gcc apporte la bibliothèque gcov si le -ftest-coverage
le drapeau est là quand il établit un lien. Essayez de passer ce drapeau sur votre ligne de commande gcc.
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 comprend à la fois les modules Fortran et C). Passer à la liaison avec gcc a fait l'affaire.
Grand Max Lybbert, essentiellement en cas d'utilisation de la configuration automatique, ajoutez _LDADD = -lgcov ...
Cela résoudra le problème.