"Hidden symbol `atexit' verwiesen wird, die von DSO" bei der Verwendung von libtool mit gcov
Ich habe ein C++ - Projekt, benutzt die GNU Autotools für seine Skripts erstellen und libtool für die Verknüpfung. Vor kurzem habe ich Hinzugefügt, code-coverage-instrumentation mit gcov, indem sichergestellt wird, dass
GCOV_CFLAGS="-fprofile-arcs -ftest-coverage"
GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage"
bekommen..in meiner CFLAGS
und LDFLAGS
beziehungsweise. Auf OS X 10.7.4 mit g++-4.2 (installiert homebrew), funktioniert alles einwandfrei.
Auf Ubuntu 12.04 mit g++ 4.6.3, libtool ausfällt link zu einem meiner tests:
/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 bauen auf ubuntu/g++ 4.6?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach googeln um ich sehe dieser thread, was darauf hindeutet, hinzufügen
--coverage
zuCXXFLAGS
beim laufen./configure
. In der Tat, aber es funktionierte nicht für das Plakat, es funktioniert für mich:Jedoch diese variable ist reserviert für den Paket-installer, nicht die Entwickler (mich.) Die Frage reduziert sich auf "Wie integriere ich diese in den build richtig?"
Hier ist, was nicht genug:
Auf der Annahme, dass
GCOV_CFLAGS
wird in die effektiveCXXFLAGS
(nicht gezeigt, aber es funktioniert), scheint es, wie das Update funktionieren soll. Tut es das nicht.Graben weiter, es scheint wir sollten zumindest einige Traktion, wenn wir fallen
CXXFLAGS="--coverage"
von der Befehlszeile aus und legen Sie stattdessen inconfigure.ac
irgendwo. Diese, tatsächlich, hat auch nicht funktioniert , es sei denn, die Linie wird über dieAC_PROG_CXX
Aufruf, wählt der compiler.So, jetzt gewinnen wir einen kleinen Einblick.
AC_PROG_CXX
verändert sich etwas, wenn Sie sieht--coverage
, was sehr wahrscheinlich ist, warum die Platzierung inGCOV_CFLAGS
hat nicht funktioniert: es war zu spät.Suchen gezielt über die Protokolle, es scheint die geheime Zutat ist die automatische Aufnahme von
-lgcov
in die fehlerhafte Verlinkung Schritt. Ich bin mir nicht sicher, dass diese Bibliothek benötigt werden, wie eine geheime, aber wenn ich meine Variablen so:..und sicherzustellen
GCOV_LIBS
ist enthalten inLIBS
, dann funktioniert es auf allen meinen Plattformen.BEARBEITEN: Siehe auch dieser thread.
configure.ac
fürGCOV_ENABLED
)--coverage
ist das äquivalent von-fprofile-arcs -ftest-coverage
während der Kompilierung und-lgcov
während die Verknüpfung.In einer allgemeineren Art und Weise, dieser Fehler kann behoben werden, indem Sie sicher Ihre Bibliotheken bestellt werden ordnungsgemäß auf Ihre link-Befehlszeile.