undefinierter Verweis auf boost :: system :: system_category () beim Kompilieren


105

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?


6
Das ist kein Compilerfehler, sondern ein Linkerfehler . Sie müssen eine Verknüpfung zur Boost.System-Bibliothek herstellen.
ildjarn

Antworten:


160

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_systemzu Ihrer Compiler-Befehlszeile hinzuzufügen , um eine Verknüpfung mit dieser Bibliothek herzustellen.


3
Ich benutze ein g ++ Makefile für die Kompilierung. Wo setzt man normalerweise solche Flaggen?
user1049697

2
Die Zusammenstellung der Compiler / Linker-Befehlszeile ist von Fall zu Fall sehr unterschiedlich. Warum fügen Sie Ihr Makefile (oder die relevanten Teile davon) nicht in Ihre Frage ein? Auf diese Weise erhalten Sie eine Antwort, die in Ihrem speziellen Fall funktioniert.
hc_

7
Ok, ich habe Makefile.am bearbeitet und hinzugefügt -lboost_system, also sah es so aus : sslsniff_LDFLAGS = -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp -lboost_system. Es hat aber nicht geholfen ...
user1049697

1
Immer noch der gleiche Fehler? Bist du autoreconfdanach gelaufen ? Auch dieser Beitrag und dieses könnte Sie mit Ihrem Autotools Konfiguration helfen.
hc_

2
Ich ersetzen sslsniff_LDFLAGSmit sslsniff_LDADDin Makefile.am und das hat nicht funktioniert. Dann habe ich beide behalten sslsniff_LDFLAGSund hinzugefügt sslsniff_LDADD = -lboost_system -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp. Dann konnte ich kompilieren. Danke für die Hilfe!
user1049697

62

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 verwenden boost::system::generic_category()und boost::system::system_category()unnötig. Das Kompilieren mit dem Flag -DBOOST_SYSTEM_NO_DEPRECATEDdeaktiviert 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_ONLYwelche 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.


4
Vielen Dank!!! nichts hat geholfen, da ich Boost 1.41 (Centos SL) benutze. Das einzige, was mich befreit hat, ist die Verwendung von -DBOOST_SYSTEM_NO_DEPRECATED
Roger Rabbit

5
Eigentlich möchten Sie vielleicht -DBOOST_ERROR_CODE_HEADER_ONLY
Andrew Marshall

1
Interessanterweise ist das neue Boost - 1.66 Verhalten von havinging weniger Verweise auf system_category () usw. einführen neu in Gegenwart von Link - Bestell Fragen Link Fragen. Siehe github.com/PointCloudLibrary/pcl/pull/2236 zum Beispiel
Pixelbeat

3
Wenn Sie CMake verwenden, fügen Sie einfach 'add_definitions (-DBOOST_ERROR_CODE_HEADER_ONLY)' hinzu
nickolay

1
Das einzige Problem, das bei Boost 1.68 für mich funktioniert hat, war das Definieren BOOST_ERROR_CODE_HEADER_ONLY.
Sakra

17

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).


1
Ich bin kürzlich auf dieses Problem gestoßen. Nichts funktioniert außer diesem. Ich frage mich, ob dies immer noch durch Boost entmutigt wird, wie in Marc Glisses Antwort erwähnt.
John Z. Li

1
quote "Boost.System ist jetzt nur noch als Header verfügbar. Aus Gründen der Kompatibilität wird noch eine Stub-Bibliothek erstellt, eine Verknüpfung ist jedoch nicht mehr erforderlich."
John Z. Li

16

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_systemLinker-Flags hinzufügen , die dem Linker anzeigen, dass er nach Symbolen wie boost::system::system_category()in der Bibliothek suchen muss libboost_system.so.

Wenn Sie main.cpp haben, entweder:

g++ main.cpp -o main -lboost_system

ODER

g++ -c -o main.o main.cpp
g++ main.o -lboost_system

5
Das Leerzeichen zwischen -l und dem Bibliotheksnamen ist falsch. Sie sollten -lboost_system
portforwardpodcast

1
Ich fand, dass Centos sich nicht um die Position von -l kümmerte, aber Ubuntu tat es, muss am Ende sein.
fragte_io

7

Stellen Sie bei Verwendung von CMAKE und find_package Folgendes sicher:

find_package(Boost COMPONENTS system ...)

und nicht

find_package(boost COMPONENTS system ...)

Einige Leute haben vielleicht Stunden dafür verloren ...


6

Ich habe das gleiche Problem:

g++ -mconsole -Wl,--export-all-symbols -LC:/Programme/CPP-Entwicklung/MinGW-4.5.2/lib  -LD:/bfs_ENTW_deb/lib   -static-libgcc -static-libstdc++ -LC:/Programme/CPP-Entwicklung/boost_1_47_0/stage/lib   \
 D:/bfs_ENTW_deb/obj/test/main_filesystem.obj \
 -o D:/bfs_ENTW_deb/bin/filesystem.exe -lboost_system-mgw45-mt-1_47 -lboost_filesystem-mgw45-mt-1_47

D: /bfs_ENTW_deb/obj/test/main_filesystem.obj: main_filesystem.cpp :(. Text + 0x54): undefinierter Verweis auf `boost :: system :: generic_category ()

Die Lösung bestand darin, die Debug-Version der System-Bibliothek zu verwenden:

g++ -mconsole -Wl,--export-all-symbols -LC:/Programme/CPP-Entwicklung/MinGW-4.5.2/lib  -LD:/bfs_ENTW_deb/lib   -static-libgcc -static-libstdc++ -LC:/Programme/CPP-Entwicklung/boost_1_47_0/stage/lib   \
 D:/bfs_ENTW_deb/obj/test/main_filesystem.obj \
 -o D:/bfs_ENTW_deb/bin/filesystem.exe -lboost_system-mgw45-mt-d-1_47 -lboost_filesystem-mgw45-mt-1_47

Aber wieso?


1
Kann es sein, dass irgendwo ein Debug-Flag definiert wurde, so dass Sie andere Bibliotheken in Debug eingebaut hatten oder g ++ Debug-Obj produzierte?
Noonex

4

Als ich dieses Problem hatte, war die Ursache die Reihenfolge der Bibliotheken. Um es zu beheben, habe ich libboost_systemzuletzt gesetzt:

g++ mingw/timer1.o -o mingw/timer1.exe  -L/usr/local/boost_1_61_0/stage/lib \
    -lboost_timer-mgw53-mt-1_61 \
    -lboost_chrono-mgw53-mt-1_61 \
    -lboost_system-mgw53-mt-1_61

Dies war auf mingw mit gcc 5.3 und Boost 1.61.0 mit einem einfachen Timer-Beispiel.


1
Das war auch mein Problem. Ich habe es über CMake aufgenommen und aus irgendeinem Grund angenommen, dass Abhängigkeiten und Reihenfolge im FindBoost-Skript ausgearbeitet wurden. In Wirklichkeit bestand mein Problem jedoch darin, immer gemeinsam genutzte Bibliotheken zu verwenden und nie darauf zu achten, dann zu statischen Bibliotheken zu wechseln und Buildfehler zu erhalten. Hoppla.
Anthony

Dies hat es auch für mich behoben ... Vor dieser Lösung hat nur BOOST_ERROR_CODE_HEADER_ONLY definiert. Boosten Sie unter Ubuntu 18.04 1.68 mit cmake. Mein Fix: target_link_libraries (ausführbares pthread ssl crypto boost_system)
Luis

2

In meinem Fall -lboost_systemreichte 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 ./configureBefehl ändern in:

./configure CXXFLAGS="-I$HOME/include" LDFLAGS="-L$HOME/lib -Wl,-rpath-link,$HOME/lib" --with-boost-libdir=$HOME/lib --prefix=$HOME

Weitere Details finden Sie unter Boost 1.51: "Fehler: Verknüpfung mit boost_thread nicht möglich!"


1

... und falls Sie Ihre Hauptdaten statisch verknüpfen möchten, fügen Sie in Ihrem Jamfile Folgendes zu den Anforderungen hinzu:

<link>static
<library>/boost/system//boost_system

und vielleicht auch:

<linkflags>-static-libgcc
<linkflags>-static-libstdc++
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.