"Il simbolo nascosto `atexit' fa riferimento a DSO" quando si utilizza libtool con gcov
Domanda
Ho un progetto C++ che utilizza GNU Autotools per i suoi script di compilazione e libtool per il collegamento.Recentemente ho aggiunto la strumentazione di copertura del codice con gcov, garantendolo
GCOV_CFLAGS="-fprofile-arcs -ftest-coverage"
GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage"
..entra nel mio CFLAGS
E LDFLAGS
rispettivamente.Su OS X 10.7.4 utilizzando 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 correggere la mia build su Ubuntu/g++ 4.6?
Soluzione
Dopo aver cercato su Google, vedo questo filo, che suggerisce di aggiungere --coverage
A CXXFLAGS
durante la corsa ./configure
.In effetti, anche se non ha funzionato per quel poster, funziona per me:
./configure CXXFLAGS="--coverage"
Tuttavia questa variabile è riservata all'installatore del pacchetto, non al manutentore (io). La domanda si riduce a "Come posso incorporarlo correttamente nella build?"
Ecco cosa c'è non Abbastanza:
GCOV_CFLAGS="-fprofile-arcs -ftest-coverage --coverage"
GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage"
Partendo dal presupposto che GCOV_CFLAGS
viene incluso nell'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 in caso di caduta CXXFLAGS="--coverage"
dalla riga di comando e inserirlo invece configure.ac
in qualche luogo.In realtà anche questo non ha funzionato salvo che la linea è posizionata sopra il AC_PROG_CXX
chiamata che seleziona il compilatore.
Quindi ora otteniamo un po’ di informazioni. AC_PROG_CXX
sta alterando qualcosa quando vede --coverage
, che è molto probabilmente il motivo per cui il posizionamento in GCOV_CFLAGS
non ha funzionato:era troppo tardi.
Osservando attentamente i registri, sembra che la salsa segreta sia l'inclusione automatica di -lgcov
nella fase di collegamento non riuscita.Non sono sicuro che questa libreria dovesse essere così segreta, ma se cambio le mie variabili in questo modo:
GCOV_CFLAGS="-fprofile-arcs -ftest-coverage --coverage"
GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage"
GCOV_LIBS="-lgcov"
..e garantire GCOV_LIBS
è incluso in LIBS
, quindi funziona tutto, su tutte le mie piattaforme.
MODIFICARE:Guarda anche questo filo.
Altri suggerimenti
In un modo più generico, questo errore può essere risolto assicurandosi che le tue librerie siano ordinate correttamente sulla riga di comando del collegamento.