C ++ Boost: undefinierter Verweis auf boost :: system :: generic_category ()

90

Ich versuche, BoostBibliotheken in mein Projekt aufzunehmen, und habe Probleme damit. Ich bin auf Ubuntu 12.10 mit Codeblocks IDE und habe versucht, die Bibliotheken manuell zu installieren, indem ich Anweisungen von der Site gelesen habe, aber es wurden Fehler mit dem Header sowie vor der Verwendung zu erstellende Bibliotheken angezeigt.

Ich habe dann die Bibliotheken über terminalby installiert sudo apt-get install libboost-all-dev. Danach kann ich in meinen Programmen auf Codeblocks folgende Header einfügen. #include <boost/regex.hpp>Wenn ich jedoch versuche, den Header für die Dateisystembibliothek ( #include "boost/filesystem/operations.hpp" ) einzuschließen, wird folgende Fehlermeldung angezeigt :

/usr/include/boost/system/error_code.hpp|214|undefined reference to boost::system::generic_category()'|

Ich bin nicht sicher, wie ich diesen Fehler beheben soll (speziell in Codeblocks unter Linux). Ich könnte hier wirklich Hilfe gebrauchen.

Compiler: Gcc
Programmcode: Nur versucht, die obige Dateisystemdatei einzuschließen operations.hpp.

Erstellen Sie ein Protokoll aus Codeblocks:

Build started on: 20-11-2012 at 18:02.53
Build ended on: 20-11-2012 at 18:02.54
-------------- Build: Debug in libopenFrameworks ---------------
Target is up to date.
-------------- Build: Debug in reader1 ---------------
make -s -f Makefile Debug
linking i686 bin/reader1_debug linux
obj/i686Debug/src/testApp.o: In function `__static_initialization_and_destruction_0':
/usr/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
obj/i686Debug/src/main.o: In function `__static_initialization_and_destruction_0':
/usr/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
collect2: ld returned 1 exit status
make: *** [bin/reader1_debug] Error 1
Process terminated with status 2 (0 minutes, 1 seconds)
6 errors, 0 warnings
Chiffre
quelle
Wenn Sie es nicht richtig verknüpfen, werden Codeblocks es nicht für Sie tun, im Gegensatz zu Ihrem Systempfad und System-Repository.
pyCthon
@pyCthon: In diesem Fall können Sie weitere Details hinzufügen, wie dies in Code :: -Blöcken verknüpft werden kann. Ich habe versucht, das Linker-Flag -lboost_systeman einer bestimmten Stelle in den Einstellungen hinzuzufügen , aber es wurde nicht aufgelöst. Ich bin mir jedoch nicht einmal sicher, ob ich die ganze Linker-Flag-Sache am richtigen Ort gemacht habe. Ein bisschen mehr Detail wäre eine große Hilfe.
Chiffre
Nun, welchen Compiler benutzt du? mingw? gcc? Welchen Code versuchen Sie auszuführen? Geben Sie ein Beispiel .....
PyCthon
@pyCthon: Comiler ist Gcc. Ich habe bis jetzt keinen Code geschrieben, aber versucht, die Boost filesystem library(operation.hpp im obigen Beitrag)
Cipher
Funktioniert es, ein reguläres Programm mit der Boost-Dateisystembibliothek über die Befehlszeile mit g ++ zu kompilieren?
PyCthon

Antworten:

139

Sie sollten in der libboost_systemBibliothek verlinken . Ich bin mir bei Codeblöcken nicht sicher, aber die g ++ - Befehlszeilenoption auf Ihrer Plattform wäre

-lboost_system

Juanchopanza
quelle
Ich habe jedoch bereits das Linker-Flag gefunden, das hinzugefügt werden soll. Kann es in Codeblocks nicht zum Laufen bringen.
Chiffre
@Cipher können Sie die Build- und Link-Befehle erhalten, die von Codeblocks ausgeführt werden?
Juanchopanza
@Cipher sorry, Pastebin ist bei der Arbeit blockiert. Ich kann es später überprüfen, aber es wird einige Stunden dauern.
Juanchopanza
Kein Problem. Auch in der Post aktualisiert
Cipher
Ich habe das gleiche Problem wie bei Cipher, nur in meinem Fall beschäftige ich mich mit boost / asio.hpp. Ich erhalte diese Fehlermeldung s1.directupload.net/images/130608/koyvqpdp.jpg, wenn ich versuche, einen Compiler zu erstellen . Wenn ich versuche, -lboost_system hinzuzufügen, heißt es "lboost_system kann nicht gefunden werden". Was ist das Problem?
Ddacot
21

Abhängig von der Boost-Version wird libboost-system mit dem Suffix -mt geliefert, das die Multithreading-Fähigkeit der Bibliotheken angeben soll.

Wenn -lboost_systemder Linker ihn nicht finden kann, versuchen Sie es -lboost_system-mt.

tssch
quelle
1
Dies funktioniert, da für diese Boost-Versionen der tatsächliche Name der Bibliotheksdatei ein -mtSuffix hatte.
Tssch
9

Es ist ein Linker-Problem. Fügen Sie den statischen Bibliothekspfad in Ihr Projekt ein.

Öffnen Sie für Qt Creator die Projektdatei .pround fügen Sie die folgende Zeile hinzu:

LIBS += -L<path for boost libraries in the system> -lboost_system

In meinem Fall Ubuntu x86_64:

LIBS += -L/usr/lib/x86_64-linux-gnu -lboost_system

Öffnen Sie für Codeblöcke die Settings->Compiler...->LinkerRegisterkarte Einstellungen und fügen Sie Folgendes hinzu:

boost_system

Klicken Sie auf das Text-Widget "Bibliotheken verknüpfen" und drücken Sie die OKTaste.

GLR
quelle
7

Ich habe auch nach einer Lösung gesucht und keine der Antworten hat den Fehler behoben. Bis ich die Antwort von "ViRuSTriNiTy" auf diesen Thread gefunden habe: Undefinierter Verweis auf 'boost :: system :: generic_category ()'?

Versuchen Sie gemäß dieser Antwort, diese Zeilen zu Ihrer cmake-Datei hinzuzufügen:

find_package(Boost 1.55.0 REQUIRED COMPONENTS system filesystem)
include_directories(... ${Boost_INCLUDE_DIRS})
link_directories(... ${Boost_LIBRARY_DIRS})
target_link_libraries(... ${Boost_LIBRARIES})
SubMachine
quelle
5

Diese Antwort hat tatsächlich bei der Verwendung von Boost und cmake geholfen.

Hinzufügen add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)für cmake - Datei.

Meine CMakeLists.txt sieht folgendermaßen aus:

cmake_minimum_required(VERSION 3.12)
project(proj)

set(CMAKE_CXX_STANDARD 17)


set(SHARED_DIR "${CMAKE_SOURCE_DIR}/../shared")

set(BOOST_LATEST_DIR            "${SHARED_DIR}/boost_1_68_0")
set(BOOST_LATEST_BIN_DIR        "${BOOST_LATEST_DIR}/stage/lib")
set(BOOST_LATEST_INCLUDE_DIR    "${BOOST_LATEST_DIR}/boost")
set(BOOST_SYSTEM                "${BOOST_LATEST_BIN_DIR}/libboost_system.so")
set(BOOST_FS                    "${BOOST_LATEST_BIN_DIR}/libboost_filesystem.so")
set(BOOST_THREAD                "${BOOST_LATEST_BIN_DIR}/libboost_thread.so")

set(HYRISE_SQL_PARSER_DIR           "${SHARED_DIR}/hyrise_sql_parser")
set(HYRISE_SQL_PARSER_BIN_DIR       "${HYRISE_SQL_PARSER_DIR}")
set(HYRISE_SQL_PARSER_INCLUDE_DIR   "${HYRISE_SQL_PARSER_DIR}/src")
set(HYRISE_SQLPARSER                "${HYRISE_SQL_PARSER_BIN_DIR}/libsqlparser.so")


include_directories(${CMAKE_SOURCE_DIR} ${BOOST_LATEST_INCLUDE_DIR} ${HYRISE_SQL_PARSER_INCLUDE_DIR})

set(BOOST_LIBRARYDIR "/usr/lib/x86_64-linux-gnu/")
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)

add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)

find_package(Boost 1.68.0 REQUIRED COMPONENTS system thread filesystem)

add_executable(proj main.cpp row/row.cpp row/row.h table/table.cpp table/table.h page/page.cpp page/page.h
        processor/processor.cpp processor/processor.h engine_instance.cpp engine_instance.h utils.h
        meta_command.h terminal/terminal.cpp terminal/terminal.h)


if(Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIRS})
    target_link_libraries(proj PUBLIC Boost::system Boost::filesystem Boost::thread ${HYRISE_SQLPARSER})
endif()
sdd
quelle
4

Das gleiche Problem beim Erstellen eines einfachen Boost-Beispiels, das behoben wurde, nachdem ich das g ++ - Compiler-Flag von -std = c ++ 14 in -std = c ++ 11 geändert hatte .

Und mir ist aufgefallen, dass es sich um ein C ++ 11-Beispiel handelt ...

Halowb
quelle
Das hat mein Problem gelöst. Es ist ziemlich leicht, die beim Kompilieren verwendeten Flags zu vergessen, insbesondere wenn Sie die Standardflags verwenden.
Filipe Calasans
3

Ich hatte das gleiche Problem und benutze auch Linux Mint (als Nuduoz). Ich mein Fall Problem wurde gelöst, nachdem ich hinzugefügt boost_systemhabe GCC C++ Linker->Libraries.

piotr93
quelle
1

Sie könnten auf ein anderes Problem stoßen. Nach der Installation von Boost unter Linux Mint hatte ich das gleiche Problem. Verknüpfen -lboost_systemoder -lboost_system-mtnicht funktioniert, weil die Bibliothek einen Namen hatte libboost_system.so.1.54.0.

Die Lösung besteht also darin, einen symbolischen Link zur Originaldatei zu erstellen. In meinem Fall

sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_system.so.1.54.0 /usr/lib/libboost_system.so

Weitere Informationen finden Sie in dieser Frage.

Nuduoz
quelle
1

Wenn die Bibliothek nicht installiert ist, sollten Sie den Ordner für Boost-Bibliotheken angeben:

Beispiel:

g ++ -L / usr / lib / x86_64-linux-gnu -lboost_system -lboost_filesystem prog.cpp -o prog

Majukarma
quelle
0

Versuchen

g++ -c main.cpp && g++ main.o /usr/lib/x86_64-linux-gnu/libboost_system.so && ./a.out 

/usr/lib/x86_64-linux-gnu/ ist der Speicherort der Boost-Bibliothek

Verwenden find /usr/ -name '*boost*.so'Sie diese Option, um den Speicherort der Boost-Bibliothek zu ermitteln

Algometrix
quelle
0

g ++ -lboost_system -lboost_filesystem userentry.cpp -o userentry

funktionierte perfekt unter debian. (Boost C ++ - Bibliotheken, die mit apt-get installiert wurden).

Majukarma
quelle
0

Nachdem ich die oben beschriebenen Lösungsvorschläge getestet hatte, stellte ich fest, dass nur diese wenigen Zeilen funktionieren würden.

Ich benutze Ubuntu 16.04.

cmake_minimum_required (VERSION 3.13)
Projekt (myProject)

set (CMAKE_CXX_STANDARD 11)
add_executable (myProject main.cpp)

find_package (Boost 1.58.0 ERFORDERLICHE KOMPONENTEN Systemdateisystem)
target_link_libraries (myProject $ {Boost_LIBRARIES})

Alan Yang
quelle