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.