C ++ Boost: referencia indefinida a boost :: system :: generic_category ()

92

Estoy tratando de incluir Boostbibliotecas en mi proyecto y he tenido problemas en el mismo. Estoy en Ubuntu 12.10 con Codeblocks IDE e intenté instalar las bibliotecas manualmente leyendo las instrucciones del sitio, pero recibía errores con el encabezado y las bibliotecas que se deben construir antes de usar.

Luego instalé las bibliotecas a través de terminalby sudo apt-get install libboost-all-dev. Después de esto, en mis programas en Codeblocks, puedo incluir encabezados como, #include <boost/regex.hpp>pero cuando trato de incluir el encabezado para la biblioteca del sistema de archivos ( #include "boost/filesystem/operations.hpp" ), aparece el siguiente error:

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

No estoy seguro de cómo resolver este error (específicamente en Codeblocks en Linux). Realmente me vendría bien un poco de ayuda aquí.

Compilador: Gcc
Código de programa: Solo se intentó incluir el archivo del sistema de operations.hpparchivos anterior.

Crear registro a partir de 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
Cifrar
fuente
no lo vincula correctamente, los bloques de código no lo harán por usted, a diferencia de la ruta del sistema y el repositorio del sistema,
pyCthon
@pyCthon: En ese caso, ¿puede agregar más detalles sobre cómo vincular esto en Code :: blocks? Intenté agregar la bandera del vinculador -lboost_systemen algún lugar de la configuración, pero no se resolvió. Sin embargo, ni siquiera estoy seguro de si hice todo el asunto del indicador del enlazador en el lugar correcto. Un poco más de detalle sería de gran ayuda.
Cifrado
bueno, ¿qué compilador estás usando? mingw? gcc? ¿Qué código estás intentando ejecutar? dar un ejemplo .....
pyCthon
@pyCthon: el compilador es Gcc. No he escrito ningún código hasta ahora, pero he intentado incluir el Boost filesystem library(operation.hpp en la publicación anterior)
Cipher
¿Funciona compilando un programa regular con la biblioteca del sistema de archivos boost desde la línea de comandos con g ++?
pyCthon

Respuestas:

141

Debe vincular en la libboost_systembiblioteca. No estoy seguro acerca de los bloques de código, pero la opción de línea de comandos g ++ en su plataforma sería

-lboost_system

juanchopanza
fuente
Sin embargo, ya encontré la bandera del vinculador para agregar. No puedo hacerlo funcionar en Codeblocks.
Cifrado
@Cipher ¿puede obtener los comandos de construcción y enlace ejecutados por bloques de código?
juanchopanza
@Cipher lo siento, pastebin está bloqueado en el trabajo. Puedo comprobarlo más tarde, pero tardaré unas horas.
juanchopanza
No hay problema. Actualizado en la publicación también
Cipher
Tengo el mismo problema que Cipher, solo que en mi caso trato con boost / asio.hpp. Recibo este error s1.directupload.net/images/130608/koyvqpdp.jpg cuando intento compilar . Cuando intento agregar -lboost_system, dice "no se puede encontrar lboost_system". ¿Cuál es el problema?
ddacot
21

Dependiendo de la versión boost, libboost-system viene con el sufijo -mt que debería indicar la capacidad de múltiples subprocesos de las bibliotecas.

Entonces, si -lboost_systemel vinculador no puede encontrarlo, intente -lboost_system-mt.

tssch
fuente
1
Funciona porque para estas versiones de refuerzo, el nombre del archivo de biblioteca real tenía un -mtsufijo.
tssch
9

Es un problema de enlazador. Incluya la ruta de la biblioteca estática en su proyecto.

Para Qt Creator, abra el archivo del proyecto .proy agregue la siguiente línea:

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

En mi caso Ubuntu x86_64:

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

Para Codeblocks, abra la Settings->Compiler...->Linkerpestaña de configuración y agregue:

boost_system

al widget de texto de bibliotecas de enlaces y presione el OKbotón.

GLR
fuente
7

También busqué una solución, y ninguna de las respuestas que encontré resolvió el error, hasta que encontré la respuesta de "ViRuSTriNiTy" a este hilo: ¿ Referencia no definida para 'boost :: system :: generic_category ()'?

de acuerdo con esa respuesta, intente agregar estas líneas a su archivo 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})
Submáquina
fuente
5

Esta respuesta realmente ayudó al usar Boost y cmake.

Añadiendo el add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)archivo cmake.

Mi CMakeLists.txt se ve así:

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
fuente
4

El mismo problema en la construcción de un ejemplo de refuerzo simple, resuelto después de que cambié el indicador del compilador g ++ de -std = c ++ 14 a -std = c ++ 11 .

Y me di cuenta de que es un ejemplo de C ++ 11 ...

Halowb
fuente
Eso resolvió mi problema. Es bastante fácil olvidar los indicadores utilizados durante la compilación, especialmente cuando se utilizan los predeterminados.
Filipe Calasans
3

Tuve el mismo problema y también uso Linux Mint (como nuduoz). Mi problema de caso se resolvió después de agregar boost_systema GCC C++ Linker->Libraries.

piotr93
fuente
1

Podría encontrarse con otro problema. Después de instalar Boost en Linux Mint, tuve el mismo problema. Vinculando -lboost_systemo -lboost_system-mtno ha funcionado porque la biblioteca tiene un nombrelibboost_system.so.1.54.0 .

Entonces, la solución es crear un enlace simbólico al archivo original. En mi caso

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

Para obtener más información, consulte esta pregunta.

nuduoz
fuente
1

Si la biblioteca no está instalada, debe dar impulso a la carpeta de bibliotecas:

ejemplo:

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

Majukarma
fuente
0

tratar

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

/usr/lib/x86_64-linux-gnu/ es la ubicación de la biblioteca boost

utilizar find /usr/ -name '*boost*.so'para encontrar la ubicación de la biblioteca de impulso

algometrix
fuente
0

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

funcionó perfectamente bajo debian. (boost las bibliotecas de C ++ instaladas con apt-get).

majukarma
fuente
0

Después de probar las soluciones propuestas descritas anteriormente, descubrí que solo estas pocas líneas funcionarían.

Estoy usando Ubuntu 16.04.

proyecto cmake_minimum_required (VERSIÓN 3.13)
(myProject)

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

find_package (Boost 1.58.0 REQUIRED COMPONENTS sistema de archivos del sistema)
target_link_libraries (myProject $ {Boost_LIBRARIES})

Alan Yang
fuente