Ich versuche, ein Programm unter Ubuntu 11.10 zu kompilieren, das die Boost-Bibliotheken verwendet. Ich habe die Boost-Bibliotheken 1.46-dev aus dem Ubuntu-Repository installiert, erhalte jedoch beim Kompilieren des Programms eine Fehlermeldung.
undefined reference to boost::system::system_category()
Was mache ich falsch?
Antworten:
Die von Ihnen verwendete Boost-Bibliothek hängt von der Bibliothek boost_system ab. (Nicht alle von ihnen.)
Angenommen, Sie verwenden gcc, versuchen Sie, es
-lboost_system
zu Ihrer Compiler-Befehlszeile hinzuzufügen , um eine Verknüpfung mit dieser Bibliothek herzustellen.quelle
-lboost_system
, also sah es so aus :sslsniff_LDFLAGS = -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp -lboost_system
. Es hat aber nicht geholfen ...autoreconf
danach gelaufen ? Auch dieser Beitrag und dieses könnte Sie mit Ihrem Autotools Konfiguration helfen.sslsniff_LDFLAGS
mitsslsniff_LDADD
in Makefile.am und das hat nicht funktioniert. Dann habe ich beide behaltensslsniff_LDFLAGS
und hinzugefügtsslsniff_LDADD = -lboost_system -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp
. Dann konnte ich kompilieren. Danke für die Hilfe!Die Verknüpfung mit einer Bibliothek, die das fehlende Symbol definiert (
-lboost_system
) ist die offensichtliche Lösung, aber im speziellen Fall von Boost.System, ein misfeature im ursprünglichen Design macht es verwendenboost::system::generic_category()
undboost::system::system_category()
unnötig. Das Kompilieren mit dem Flag-DBOOST_SYSTEM_NO_DEPRECATED
deaktiviert diesen Code und lässt eine Reihe von Programmen kompilieren, ohne dass dies erforderlich ist-lboost_system
(dieser Link wird natürlich weiterhin benötigt, wenn Sie einige Funktionen der Bibliothek explizit verwenden).Ab Boost 1.66 und diesem Commit ist dieses Verhalten nun die Standardeinstellung, sodass hoffentlich immer weniger Benutzer diese Antwort benötigen sollten.
Wie von @AndrewMarshall bemerkt, besteht eine Alternative darin, zu definieren,
BOOST_ERROR_CODE_HEADER_ONLY
welche eine Nur-Header-Version des Codes aktiviert . Dies wurde entmutigt von Boost , wie es einige Funktionen brechen kann. Seit 1.69 scheint jedoch nur der Header zum Standard geworden zu sein , was diese Frage angeblich überflüssig macht.quelle
BOOST_ERROR_CODE_HEADER_ONLY
.Eine weitere Problemumgehung für diejenigen, die nicht den gesamten Shebang benötigen: Verwenden Sie den Schalter
-DBOOST_ERROR_CODE_HEADER_ONLY
.Wenn Sie CMake verwenden, ist es
add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)
.quelle
Der obige Fehler ist ein Linkerfehler ... der Linker ein Programm, das ein oder mehrere von einem Compiler generierte Objekte zu einem einzigen ausführbaren Programm kombiniert.
Sie müssen
-lboost_system
Linker-Flags hinzufügen , die dem Linker anzeigen, dass er nach Symbolen wieboost::system::system_category()
in der Bibliothek suchen musslibboost_system.so
.Wenn Sie main.cpp haben, entweder:
ODER
quelle
Stellen Sie bei Verwendung von CMAKE und find_package Folgendes sicher:
und nicht
Einige Leute haben vielleicht Stunden dafür verloren ...
quelle
Ich habe das gleiche Problem:
Die Lösung bestand darin, die Debug-Version der System-Bibliothek zu verwenden:
Aber wieso?
quelle
Als ich dieses Problem hatte, war die Ursache die Reihenfolge der Bibliotheken. Um es zu beheben, habe ich
libboost_system
zuletzt gesetzt:Dies war auf mingw mit gcc 5.3 und Boost 1.61.0 mit einem einfachen Timer-Beispiel.
quelle
In meinem Fall
-lboost_system
reichte das Hinzufügen nicht aus, es konnte jedoch immer noch nicht in meiner benutzerdefinierten Build-Umgebung gefunden werden. Ich musste den Rat unter "gcc - / usr / bin / ld: Warnung lib nicht gefunden" verwenden und meinen./configure
Befehl ändern in:Weitere Details finden Sie unter Boost 1.51: "Fehler: Verknüpfung mit boost_thread nicht möglich!"
quelle
... und falls Sie Ihre Hauptdaten statisch verknüpfen möchten, fügen Sie in Ihrem Jamfile Folgendes zu den Anforderungen hinzu:
und vielleicht auch:
quelle