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?
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.
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.
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
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)
.
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 ...
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?
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.
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!"
... 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++