„Das versteckte Symbol „atexit“ wird von DSO referenziert“, wenn libtool mit gcov verwendet wird
Frage
Ich habe ein C++-Projekt, das die GNU Autotools für seine Build-Skripte und libtool für die Verknüpfung verwendet.Kürzlich habe ich die Code-Coverage-Instrumentierung mit gcov hinzugefügt, um dies sicherzustellen
GCOV_CFLAGS="-fprofile-arcs -ftest-coverage"
GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage"
..wird in meine aufgenommen CFLAGS
Und LDFLAGS
jeweils.Unter OS X 10.7.4 mit g++-4.2 (von Homebrew installiert) funktioniert alles einwandfrei.
Unter Ubuntu 12.04 mit g++ 4.6.3 kann libtool einen meiner Tests nicht 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 korrigiere ich meinen Build unter Ubuntu/g++ 4.6?
Lösung
Nachdem ich herumgegoogelt habe, verstehe ich dieser Thread, was das Hinzufügen nahelegt --coverage
Zu CXXFLAGS
beim Laufen ./configure
.Obwohl es bei diesem Poster nicht funktioniert hat, funktioniert es bei mir tatsächlich:
./configure CXXFLAGS="--coverage"
Allerdings ist diese Variable für den Paketinstaller reserviert, nicht für den Betreuer (mich). Die Frage reduziert sich auf „Wie integriere ich das richtig in den Build?“
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
wird in die Wirksamkeit einbezogen CXXFLAGS
(nicht gezeigt, aber es tut es), es scheint, als ob dieser Fix funktionieren sollte.Das ist nicht der Fall.
Wenn wir genauer hinschauen, scheint es, dass wir zumindest etwas Traktion bekommen sollten, wenn wir fallen CXXFLAGS="--coverage"
von der Befehlszeile aus und platzieren Sie es stattdessen in configure.ac
irgendwo.Das hat tatsächlich auch nicht funktioniert es sei denn Die Linie wird über dem platziert AC_PROG_CXX
Aufruf, der den Compiler auswählt.
So, nun gewinnen wir einen kleinen Einblick. AC_PROG_CXX
verändert etwas, wenn es sieht --coverage
, was sehr wahrscheinlich der Grund für die Platzierung in ist GCOV_CFLAGS
hat nicht funktioniert:es war zu spät.
Wenn man sich die Protokolle genau anschaut, sieht man, dass das Geheimnis in der automatischen Einbeziehung von liegt -lgcov
im fehlgeschlagenen Verknüpfungsschritt.Ich bin mir nicht sicher, ob diese Bibliothek so geheim sein musste, aber wenn ich meine Variablen so ändere:
GCOV_CFLAGS="-fprofile-arcs -ftest-coverage --coverage"
GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage"
GCOV_LIBS="-lgcov"
..und sicherstellen GCOV_LIBS
ist enthalten LIBS
, dann funktioniert alles, auf allen meinen Plattformen.
BEARBEITEN:Siehe auch dieser Thread.
Andere Tipps
Allgemeiner gesagt kann dieser Fehler behoben werden, indem sichergestellt wird, dass Ihre Bibliotheken in der Link-Befehlszeile richtig angeordnet sind.