2012-07-28 5 views
10

Ich habe ein C++ Projekt, das die GNU Autotools für seine Build-Skripte und libtool zum Linken verwendet. Vor kurzem habe ich Code-Coverage-Instrumentierung mit gcov hinzugefügt, indem sichergestellt wird, dass"Verstecktes Symbol` atexit 'wird von DSO referenziert "wenn libtool mit gcov verwendet wird

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

..get jeweils in meinem CFLAGS und LDFLAGS enthalten. Unter OS X 10.7.4 mit g ++ - 4.2 (installiert von Homebrew) funktioniert alles einwandfrei.

auf Ubuntu 12.04 mit g ++ 4.6.3 schlägt fehl, libtool einer meiner Tests zu verknüpfen:

/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 

Wie behebe ich meine Build auf ubuntu/g ++ 4.6?

Antwort

5

Nach dem googlen um sehe ich this thread, was vorschlägt, --coverage zu CXXFLAGS bei laufendem ./configure hinzuzufügen. In der Tat, auch wenn es nicht für das Plakat nicht funktioniert, funktioniert es für mich:

./configure CXXFLAGS="--coverage" 

jedoch diese Variable für das Paketinstallationsprogramm reserviert ist, nicht der Betreuer (. Mir) Die Frage reduziert sich auf „Wie kann ich übernehmen das in den Build richtig? "

Hier ist, was ist nicht genug:

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

Unter der Annahme, dass GCOV_CFLAGS in die wirksamen CXXFLAGS enthalten wird (nicht gezeigt, aber es tut), es scheint, wie dieses Update funktionieren soll. Es tut es nicht.

Wenn wir weiter nachforschen, scheint es, wir sollten wenigstens etwas Traktion bekommen, wenn wir CXXFLAGS="--coverage" von der Kommandozeile weglassen und stattdessen irgendwo in configure.ac platzieren. Dies funktioniert auch nicht , es sei denn die Zeile wird über den AC_PROG_CXX Aufruf, der den Compiler wählt platziert.

So jetzt gewinnen wir einen kleinen Einblick. AC_PROG_CXX ändert etwas, wenn es --coverage sieht, was sehr wahrscheinlich ist, warum die Platzierung in GCOV_CFLAGS nicht funktioniert: Es war zu spät.

Durch sorgfältige Durchsicht der Protokolle scheint die geheime Soße die automatische Einbeziehung von -lgcov in den fehlerhaften Verknüpfungsschritt. Ich bin diese Bibliothek nicht sicher, benötigt ein solches Geheimnis sein, aber wenn ich meine Variablen wie so ändern:

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

..und gewährleisten GCOV_LIBS in LIBS enthalten ist, dann alles funktioniert, auf allen meinen Plattformen.

BEARBEITEN: Siehe auch this thread.

+0

Sie arbeiten diese GCOV * vars manuell in andere Variablen oder sind sie automatisch enthalten? Wenn Sie sie manuell in andere platzieren, in welche platzieren Sie sie? – dbeer

+0

Eigentlich sieht es so aus, als ob die aktuelle Version meiner Skripts noch eine dritte Sache macht. Werfen Sie einen Blick auf https://github.com/phs/sauce/blob/master/Makefile.bin (siehe 'configure.ac' für' GCOV_ENABLED') – phs

+1

Dieser Kommentar stammt von der Abteilung für Redundanz. '--coverage' ist das Äquivalent zu' -fprofile-arcs -ftest-coverage' beim Kompilieren und '-lgcov' beim Linken. – Bulletmagnet

0

In einer allgemeineren Weise kann dieser Fehler behoben werden, indem Sie sicherstellen, dass Ihre Bibliotheken ordnungsgemäß in Ihrer Link-Befehlszeile geordnet sind.