it-swarm.com.de

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

Ich versuche, Boost-Bibliotheken in mein Projekt einzubeziehen, und ich habe Probleme mit demselben Problem gehabt. Ich bin auf Ubuntu 12.10 mit Codeblocks IDE und habe versucht, die Bibliotheken manuell zu lesen, indem ich die Anweisungen von der Site liest, aber es wurden Fehler mit dem Header und den zu verwendenden Bibliotheken angezeigt. 

Ich habe dann die Bibliotheken über terminalby Sudo apt-get install libboost-all-dev installiert. Danach kann ich in meinen Programmen für Codeblocks Header wie #include <boost/regex.hpp> einfügen, aber wenn ich versuche, den Header für die Dateisystem-Bibliothek (#include "boost/filesystem/operations.hpp") einzuschließen, erhalte ich die folgende Fehlermeldung: 

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

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

Compiler: Gcc
Programmcode: Nur versucht, die operations.hpp-Datei des obigen Dateisystems zu verwenden.

Protokoll aus Codeblocks erstellen:

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
75
Cipher

Sie sollten in der libboost_system-Bibliothek verlinken. Ich bin nicht sicher über Codeblocks, aber die g ++ Befehlszeilenoption auf Ihrer Plattform wäre

-lboost_system

127
juanchopanza

Je nach Boost-Version enthält libboost-system das Suffix -mt, das die Multithreading-Fähigkeit der Bibliotheken angibt.

Wenn also -lboost_system vom Linker nicht gefunden werden kann, versuchen Sie -lboost_system-mt.

20
tssch

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

Öffnen Sie für Qt Creator die Projektdatei .pro und 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 Codeblocks die Registerkarte Settings->Compiler...->Linker settings und fügen Sie Folgendes hinzu:

boost_system

zum Text-Widget "Bibliotheken verknüpfen" und drücken Sie OK Taste.

8
GLR

Ich habe auch nach einer Lösung gesucht und keine der gefundenen 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 entsprechend 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})
7
SubMachine

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

Und ich habe bemerkt, dass es ein C++ 11-Beispiel ist ...

2
Halowb

Diese Antwort hat tatsächlich geholfen, wenn Sie Boost und Cmake verwenden.

Hinzufügen von add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY) für die 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()
2
sdd

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

1
piotr93

Sie könnten auf ein anderes Problem stoßen. Nach der Installation von Boost unter Linux Mint hatte ich das gleiche Problem. Die Verknüpfung von -lboost_system oder -lboost_system-mt hat nicht funktioniert, da die Bibliothek den Namen libboost_system.so.1.54.0 hatte. 

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 unter this question.

1
nuduoz

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 Ort der Boost-Bibliothek

verwenden Sie find /usr/ -name '*boost*.so', um den Speicherort der Boost-Bibliothek zu finden

0
algometrix

Wenn die Bibliothek nicht installiert ist, sollten Sie den Boost-Bibliotheksordner angeben:

beispiel:

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

0
Majukarma

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

funktionierte perfekt unter debian. (Bohren Sie mit apt-get installierte C++ - Bibliotheken).

0
majukarma

Nach dem Testen der oben beschriebenen vorgeschlagenen Lösungen 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})

0
Alan Yang