C ++ Boost: riferimento undefined a boost :: system :: generic_category ()


92

Sto cercando di includere Boostbiblioteche nel mio progetto e ho dovuto affrontare problemi nello stesso. Sono su Ubuntu 12.10 con Codeblocks IDE e ho provato a installare le librerie leggendo manualmente le istruzioni dal sito, ma ricevevo errori con l'intestazione e le librerie da costruire prima dell'uso.

Ho quindi installato le librerie tramite terminalby sudo apt-get install libboost-all-dev. Dopodiché, nei miei programmi su Codeblocks, posso includere intestazioni come #include <boost/regex.hpp>ma quando provo a includere l'intestazione per la libreria Filesystem ( #include "boost/filesystem/operations.hpp" ), ricevo il seguente errore:

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

Non sono sicuro di come risolvere questo errore (in particolare in Codeblocks su Linux). Potrei davvero usare un po 'di aiuto qui.

Compilatore: Gcc
Codice programma: provato solo includendo il file system sopra operations.hpp.

Registro di compilazione da 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

non lo colleghi correttamente, i blocchi di codice non lo faranno per te a differenza del percorso di sistema e del repository di sistema,
— pyCthon

@pyCthon: In tal caso, puoi aggiungere più dettagli più dettagli su come collegarlo in Code :: blocks. Ho provato ad aggiungere il flag del linker -lboost_systemin qualche punto nelle impostazioni, ma non si è risolto. Tuttavia, non sono nemmeno sicuro di aver fatto l'intera cosa del flag del linker nel posto giusto. Un po 'più di dettaglio sarebbe di grande aiuto.
— Cipher

bene che compilatore stai usando? mingw? gcc? quale codice stai cercando di eseguire?
— fai

@pyCthon: Comiler è Gcc. Non ho scritto alcun codice fino ad ora, ma ho provato a includere Boost filesystem library(operation.hpp nel post sopra)
— Cipher

funziona compilando un programma normale con la libreria del filesystem boost dalla riga di comando con g ++?
— pyCthon

Risposte:


141

Dovresti collegarti nella libboost_systemlibreria. Non sono sicuro dei blocchi di codice, ma l'opzione della riga di comando g ++ sulla tua piattaforma lo sarebbe

-lboost_system


Tuttavia, ho già trovato il flag del linker da aggiungere. Non riesco a farlo funzionare in Codeblocks.
— Cipher

@Cipher puoi ottenere i comandi di compilazione e collegamento eseguiti da codeblocks?
— juanchopanza

@Cipher mi dispiace, pastebin è bloccato al lavoro. Posso controllare più tardi, ma ci vorranno alcune ore.
— juanchopanza

Nessun problema. Aggiornato anche nel post
— Cipher

ho lo stesso problema di Cipher, solo nel mio caso mi occupo di boost / asio.hpp. Ottengo questi errori s1.directupload.net/images/130608/koyvqpdp.jpg quando provo a compilare . Quando provo ad aggiungere -lboost_system dice "impossibile trovare lboost_system". Qual è il problema?
— ddacot

21

A seconda della versione boost, libboost-system viene fornito con il suffisso -mt che dovrebbe indicare la capacità di multithreading delle librerie.

Quindi, se -lboost_systemnon può essere trovato dal linker, provare -lboost_system-mt.


1
Funziona perché per queste versioni boost il nome del file della libreria effettivo aveva un -mtsuffisso.
— tssch

9

È un problema del linker. Includere il percorso della libreria statica nel progetto.

Per Qt Creator apri il file di progetto .proe aggiungi la seguente riga:

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

Nel mio caso Ubuntu x86_64:

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

Per Codeblocks, apri la Settings->Compiler...->Linkerscheda delle impostazioni e aggiungi:

boost_system

al widget di testo Collega librerie e premere il OKpulsante.


7

Ho cercato anche una soluzione, e nessuna delle risposte che ho incontrato ha risolto l'errore, finché non ho trovato la risposta di "ViRuSTriNiTy" a questo thread: Riferimento indefinito a 'boost :: system :: generic_category ()'?

secondo quella risposta, prova ad aggiungere queste righe al tuo file cmake:

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

5

Questa risposta ha effettivamente aiutato quando si utilizza Boost e cmake.

Aggiunta add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)per il file cmake.

Il mio CMakeLists.txt ha questo aspetto:

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

4

Stesso problema sulla creazione di un semplice esempio di boost, risolto dopo aver modificato il flag del compilatore g ++ da -std = c ++ 14 a -std = c ++ 11 .

E ho notato che è un esempio C ++ 11 ...


Questo ha risolto il mio problema. È abbastanza facile dimenticare i flag usati durante la compilazione, specialmente quando si usano quelli di default.
— Filipe Calasans

3

Ho avuto lo stesso problema e uso anche Linux Mint (come nuduoz). Il mio problema del caso è stato risolto dopo aver aggiunto boost_systema GCC C++ Linker->Libraries.


1

Potresti incontrare un altro problema. Dopo aver installato Boost su Linux Mint ho avuto lo stesso problema. Collegamento -lboost_systemo -lboost_system-mtnon ha funzionato perché la libreria aveva un nome libboost_system.so.1.54.0.

Quindi la soluzione è creare un collegamento simbolico al file originale. Nel mio caso

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

Per ulteriori informazioni vedere questa domanda.


1

Se la libreria non è installata, dovresti fornire la cartella Boost libraries:

esempio:

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


0

provare

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

/usr/lib/x86_64-linux-gnu/ è la posizione della libreria boost

utilizzare find /usr/ -name '*boost*.so'per trovare la posizione della libreria boost


0

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

ha funzionato perfettamente con Debian. (potenzia le librerie c ++ installate con apt-get).


0

Dopo aver testato le soluzioni proposte sopra descritte, ho scoperto che solo queste poche righe avrebbero funzionato.

Sto usando Ubuntu 16.04.

cmake_minimum_required (VERSION 3.13)
progetto (myProject)

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

find_package (Boost 1.58.0 COMPONENTI RICHIESTI file system di sistema)
target_link_libraries (myProject $ {Boost_LIBRARIES})

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.