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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top