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

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


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.


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.


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

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

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 ...


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.


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.


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


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


0

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

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


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.