webentwicklung-frage-antwort-db.com.de

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

Ich versuche, ein Programm auf Ubuntu 11.10 zu kompilieren, das die Boost-Bibliotheken verwendet. Ich habe die 1.46-dev Boost-Bibliotheken aus dem Ubuntu-Repository installiert, erhalte jedoch eine Fehlermeldung beim Kompilieren des Programms.

undefined reference to boost::system::system_category()

Was mache ich falsch?

97
user1049697

Die von Ihnen verwendete Boost-Bibliothek hängt von der Bibliothek boost_system ab. (Nicht alle von ihnen.)

Angenommen, Sie verwenden gcc, fügen Sie -lboost_system Zu Ihrer Compiler-Befehlszeile hinzu, um eine Verknüpfung mit dieser Bibliothek herzustellen.

154
hc_

Das Verknüpfen mit einer Bibliothek, die das fehlende Symbol definiert (-lboost_system), Ist die offensichtliche Lösung, aber im speziellen Fall von Boost.System werden bei einem Fehler im ursprünglichen Design boost::system::generic_category() und boost::system::system_category() unnötigerweise verwendet. Das Kompilieren mit dem Flag -DBOOST_SYSTEM_NO_DEPRECATED Deaktiviert diesen Code und lässt eine Reihe von Programmen kompilieren, ohne dass -lboost_system Erforderlich ist (dieser Link wird natürlich weiterhin benötigt, wenn Sie einige Funktionen der Bibliothek explizit verwenden).

Ab Boost 1.66 und this 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, BOOST_ERROR_CODE_HEADER_ONLY Zu definieren, wodurch eine Nur-Header-Version des Codes aktiviert wird. Dies ist jedoch nicht empfohlen von Boost, da es einige Funktionen beeinträchtigen kann.

55
Marc Glisse

Der obige Fehler ist ein Linker-Fehler ... der Linker ein Programm, das ein oder mehrere von einem Compiler generierte Objekte nimmt und sie zu einem einzigen ausführbaren Programm kombiniert.

Sie müssen '-l boost_system' zu Ihren Linker-Flags hinzufügen, was dem Linker anzeigt, dass er in der Bibliothek nach Symbolen wie boost::system::system_category() suchen muss libboost_system.so

Wenn Sie main.cpp haben, entweder:

g++ main.cpp -o main -lboost_system

OR

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

Ein weiterer Workaround 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).

15
Vadim Berman

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

7
Kriegalex

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

Lösung war die Verwendung der Debug-Version der System-Lib:

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?

6
volker

Als ich dieses Problem hatte, war die Ursache die Reihenfolge der Bibliotheken. Um das Problem zu beheben, habe ich libboost_system zuletzt:

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 mingw mit gcc 5.3 und Boost 1.61.0 mit einem einfachen Timer-Beispiel.

4
Min Zhang

in meinem Fall, Hinzufügen von -lboost_system war nicht genug, es konnte es immer noch nicht in meiner benutzerdefinierten Build-Umgebung finden. Ich musste den Rat bei Befreie mich von "gcc -/usr/bin/ld: Warnung lib not found" und ändere mein ./configure Befehl an:

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

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

2
jcomeau_ictx

... und für den Fall, dass Sie Ihr Hauptverzeichnis statisch verlinken 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++
1
formiaczek