2012-07-28 10 views
10

Ho un progetto C++ che utilizza GNU Autotools per i suoi script di compilazione e libtool per il collegamento. Recentemente ho aggiunto strumentazione copertura del codice con gcov, facendo in modo che"Il simbolo nascosto 'atexit' è referenziato da DSO" quando si utilizza libtool con gcov

GCOV_CFLAGS="-fprofile-arcs -ftest-coverage" 
GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage" 

..get inclusa nel mio CFLAGS e LDFLAGS rispettivamente. Su OS X 10.7.4 usando g ++ - 4.2 (installato da homebrew), tutto funziona correttamente.

Su Ubuntu 12.04 utilizzando g ++ 4.6.3, libtool non riesce a collegare uno dei miei test:

/bin/bash ./libtool --tag=CXX --mode=link g++ -Wall -Wextra -Werror -ansi -fprofile-arcs -ftest-coverage -g -O0 -fprofile-arcs -ftest-coverage -L/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib -o myproj/inttests/locale_test myproj/inttests/locale_test.o myproj/app/libapp.la -lboost_thread-mt -lboost_system-mt -pthread -llog4cplus 
libtool: link: g++ -Wall -Wextra -Werror -ansi -fprofile-arcs -ftest-coverage -g -O0 -fprofile-arcs -ftest-coverage -Wl,-rpath -Wl,/usr/local/lib -o myproj/inttests/.libs/locale_test myproj/inttests/locale_test.o -pthread -L/usr/local/lib myproj/app/.libs/libapp.so -lboost_thread-mt -lboost_system-mt /usr/lib/liblog4cplus.so -pthread 
/usr/bin/ld: myproj/inttests/.libs/locale_test: hidden symbol `atexit' in /usr/lib/x86_64-linux-gnu/libc_nonshared.a(atexit.oS) is referenced by DSO 
/usr/bin/ld: final link failed: Bad value 
collect2: ld returned 1 exit status 
make[2]: *** [myproj/inttests/locale_test] Error 1 

Come posso risolvere il mio generazione su Ubuntu/g ++ 4.6?

risposta

5

Dopo aver cercato su google, vedo this thread, che suggerisce di aggiungere --coverage a CXXFLAGS quando si esegue ./configure. In effetti, anche se non ha funzionato per quel poster, funziona per me:

./configure CXXFLAGS="--coverage" 

Tuttavia questa variabile è riservato per il pacchetto di installazione, non il manutentore (. Me) La questione si riduce a "Come faccio a incorporare questo nella build correttamente? "

Ecco cosa c'è non basta:

GCOV_CFLAGS="-fprofile-arcs -ftest-coverage --coverage" 
GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage" 

Partendo dal presupposto che GCOV_CFLAGS verrà incluso nella efficace CXXFLAGS (non mostrato, ma lo fa), sembra che questa correzione dovrebbe funzionare. Non è così.

Scavando ulteriormente, sembra che dovremmo almeno ottenere un po 'di trazione se lasciamo cadere CXXFLAGS="--coverage" dalla riga di comando e invece posizionarlo in configure.ac da qualche parte. Questo, in realtà, anche non ha funzionato a meno che la linea sia posizionata sopra la chiamata AC_PROG_CXX che seleziona il compilatore.

Così ora otteniamo un po 'di intuizione. AC_PROG_CXX modifica qualcosa quando vede --coverage, che è molto probabile perché il posizionamento in GCOV_CFLAGS non ha funzionato: era troppo tardi.

Guardando con attenzione attraverso i registri, sembra che la salsa segreta sia l'inclusione automatica di -lgcov nella fase di collegamento in errore. Non sono sicuro che questa libreria doveva essere un segreto, ma se cambio le mie variabili come così:

GCOV_CFLAGS="-fprofile-arcs -ftest-coverage --coverage" 
GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage" 
GCOV_LIBS="-lgcov" 

..e assicuro GCOV_LIBS è incluso nel LIBS, allora tutto funziona, su tutti i miei piattaforme.

MODIFICA: Vedere anche this thread.

+0

Lavori manualmente questi vassoi GCOV * in altre variabili o sono inclusi automaticamente? Se li mettete manualmente in altri, in quale posto li inserite? – dbeer

+0

In realtà, sembra che la versione attuale dei miei script faccia ancora una terza cosa. Dai uno sguardo a https://github.com/phs/sauce/blob/master/Makefile.sono (vedere 'configure.ac' per' GCOV_ENABLED') – phs

+1

Questo commento è stato presentato dal Dipartimento per il Dipartimento di Redenzione. '--coverage' è l'equivalente di' -fprofile-arcs -ftest-coverage' durante la compilazione e '-lgcov' durante il collegamento. – Bulletmagnet

0

In un modo più generico, questo errore può essere risolto assicurandosi che le librerie siano ordinate correttamente nella riga di comando del collegamento.

Problemi correlati