2009-02-19 9 views
51

sto cercando di compilare una semplice applicazione con gcov e ottenere i seguenti errori di collegamento:Dove sono i simboli 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 

io non riesco a trovare la posizione dei simboli mancanti. gcov è presente sulla macchina che esegue gcc versione 4.1.2

Qualche idea? Grazie.

su Edit:

Tutto sembra funzionare bene quando si utilizza gcov con un'applicazione che è costituito da un file .c. Quando ho più file .c (quindi più file .o) ho il problema sopra riportato.

Le fasi di compilazione simile al seguente:

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 

risposta

5

ho provato un semplice file di prova con gcc -ftest-coverage -fprofile-arcs test.c e non ha avuto problemi, come si descrive.

Sospetto che gcc introduca la libreria gcov se il flag -ftest-coverage è presente quando si collega. Prova a passare quel flag sulla tua riga di comando gcc.

+0

Provato con un'applicazione a file singolo e funziona. Sto avendo problemi con la mia applicazione multi-file. Compilano bene, ma sembra confondersi. – john146

+0

p7539c @ localhost cutest> make 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 gcc AllTests.o CuTestTest.o CuTest.o -o TestTest – john146

+2

Non si sta ancora superando il parametro -ftest-coverage in l'ultima chiamata a gcc. È necessario specificarlo anche durante il collegamento. – flodin

-1

Così ho aggiunto -shared al CFLAGS, e ora sembra che funzioni con più file. Certo, si sta trasformando in un posto strano, quindi non so di cosa si tratta ancora.

13

La bandiera che stai cercando è -lgcov when linking. Cioè, il cambiamento:

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

a

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

-fprofile-arcs implica -lgcov – slicedlime

+4

Apparentemente non sempre. Vedi http://stackoverflow.com/q/11703709/580412 – phs

+1

E 'anche possibile usare '--coverage' invece di' -lgcov' come linker flag. – MKroehnert

69

Ho appena trascorso una quantità incredibile di tempo debug di un errore molto simile. Ecco cosa ho imparato:

  • Durante la compilazione è necessario passare -fprofile-arcs -ftest-coverage.
  • È necessario passare -fprofile-arcs durante il collegamento.
  • È ancora possibile ottenere strani errori del linker durante il collegamento. Faranno simile a questa:

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

Ciò significa che gconv sta avendo problemi con uno dei tuoi costruttori generati dal compilatore (nel mio caso, un costruttore di copia). Controllare la funzione menzionata nel messaggio di errore, vedere quali tipi di oggetti copia-costruisce e vedere se qualcuna di queste classi non ha un costruttore di copie. Aggiungi uno e l'errore andrà via.

Modifica: l'ottimizzazione può influire anche su questo. Prova ad attivare/disattivare le ottimizzazioni in caso di problemi.

+0

Questa risposta ha funzionato per me. – Zitrax

+1

Funziona magnificamente. Grazie per aver eseguito il tuo incredibile tempo di debugging. – Wyatt

+1

Configurare il software con "CFLAGS =" - O0 -fprofile-arcs -ftest-coverage "LDFLAGS =" - fprofile-arcs "./configure " sembra fare il trucco per me. Grazie. – oherrala

7

Ho trovato, as suggested here, che l'aggiunta di -lgcov alla riga di costruzione quando si crea una libreria condivisa che contiene .o ha costruito con -fprofile-arcs -ftest-coverage risolto per me. E naturalmente collegando l'eseguibile con -lgcov.Costruita la libreria condivisa in questo modo:

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

e l'eseguibile in questo modo:

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

Aggiunta del -lgov alla costruzione della libreria condivisa (non solo l'exe), risolto questo errore addizionale per 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 

Si noti che -lgcov deve essere l'ultima libreria collegata.

+0

Incredibile. Ho provato ad aggiungere nuove informazioni quando lo sviluppatore usa CMake ma la modifica suggerita è stata rifiutata ... grazie, ragazzi. – Tarod

+1

Preferirei scrivere la prossima spiegazione all'interno della risposta.In ogni caso, con CMake, puoi ottenere lo stesso comportamento aggiungendo 'target_link_libraries ($ {LIBRARY_NAME} gcov)' dopo 'target_link_libraries ($ {LIBRARY_NAME} gcov)' – Tarod

+0

Questo dovrebbe funzionare. Non ancora provato, aggiornerò il mio feedback dopo che ho provato. –

1

Grande Max Lybbert, In sostanza, in caso di utilizzo autoconf aggiungere _LDADD = -lgcov ...

Questo risolverà il problema.

11

Si dovrebbe essere in grado di specificare solo --coverage sulla riga di comando durante la compilazione e il collegamento.

Secondo man gcc:

L'opzione è sinonimo di -fprofile-arcs-ftest-coverage (quando compilazione) e -lgcov (durante il collegamento).

2

Forse, ovviamente, questo messaggio di errore viene generato durante il collegamento con un linker non Gcc. Vediamo questo errore durante il collegamento con ifort (perché il nostro codice include sia i moduli Fortran che C). Passare al collegamento con gcc ha funzionato.

+0

Poiché altri linker non riconoscono l'opzione '-fprofile-arcs' – Mawg