„Das versteckte Symbol „atexit“ wird von DSO referenziert“, wenn libtool mit gcov verwendet wird

StackOverflow https://stackoverflow.com//questions/11703709

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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top