С++ Boost: undefined ссылка на boost:: system:: generic_category()

Я пытаюсь включить библиотеки Boost в свой проект и столкнулся с проблемами в том же самом. Я на Ubuntu 12.10 с Codeblocks IDE и попытался установить библиотеки вручную, прочитав инструкции с сайта, но получал ошибку с заголовком, а также с библиотеками, которые должны быть встроены перед использованием.

Затем я установил библиотеки через terminalby sudo apt-get install libboost-all-dev. После этого в моих программах на Codeblocks я могу включать заголовки типа #include <boost/regex.hpp>, но когда я пытаюсь включить заголовок для библиотеки файловой системы (#include "boost/filesystem/operations.hpp"), я получаю следующую ошибку:

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

Я не уверен, как разрешить эту ошибку (особенно в Codeblocks on Linux). Я действительно мог бы здесь помочь.

Компилятор: Gcc
Программный код: Пробовал только указанный файл файловой системы operations.hpp.

Журнал сборки из кодовых блоков:

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

Ответ 1

Вы должны указать ссылку в библиотеке libboost_system. Я не уверен в кодовых блоках, но параметр командной строки g++ на вашей платформе будет

-lboost_system

Ответ 2

В зависимости от ускоренной версии libboost-system поставляется с суффиксом -mt, который должен указывать на возможности многопоточности библиотек.

Поэтому, если -lboost_system не может быть найден компоновщиком try -lboost_system-mt.

Ответ 3

Это проблема компоновщика. Включите статический путь библиотеки в ваш проект.

Для Qt Creator откройте файл проекта .pro и добавьте следующую строку:

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

В моем случае Ubuntu x86_64:

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

Для кодовых блоков откройте вкладку настроек Settings->Compiler...->Linker и добавьте:

boost_system

в текстовый виджет библиотек ссылок и нажмите кнопку OK.

Ответ 4

Я также искал решение, и ни один из ответов, с которыми я столкнулся, не разрешил ошибку, пока я не нашел ответ "ViRuSTriNiTy" на этот поток: Undefined ссылка на 'повышение:: системы:: generic_category()'?

в соответствии с этим ответом, попробуйте добавить эти строки в ваш файл 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

Такая же проблема при создании простого примера boost, решена после того, как я изменил флаг компилятора g++ с -std = С++ 14 на -std = С++ 11.

И я заметил, что это пример С++ 11...

Ответ 6

Этот ответ действительно помог при использовании Boost и cmake.

Добавление add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY) для файла cmake.

Мой CMakeLists.txt выглядит так:

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

Ответ 7

Вы можете столкнуться с другой проблемой. После установки Boost на Монетный двор Linux у меня была та же проблема. Связывание -lboost_system или -lboost_system-mt не работало, потому что библиотека имела имя libboost_system.so.1.54.0.

Итак, решение состоит в создании символической ссылки на исходный файл. В моем случае

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

Для получения дополнительной информации см. этот вопрос.

Ответ 8

У меня была та же проблема, а также использовать Linux Mint (как nuduoz). Проблема моего случая была решена после добавления boost_system в GCC C++ Linker->Libraries.

Ответ 9

попробуйте

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

/usr/lib/x86_64-linux-gnu/ - это местоположение библиотеки ускорения

используйте find /usr/ -name '*boost*.so', чтобы найти местоположение библиотеки ускорений

Ответ 10

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

отлично работал под дебианским. (библиотеки ускорения c++, установленные с помощью apt-get).

Ответ 11

Il библиотека не установлена, вы должны предоставить папку с расширенными библиотеками:

пример:

g++ -L/usr/lib/x86_64 -L inux-gnu -L boost_system -L boost_filesystem prog.cpp -o prog

Ответ 12

После тестирования предложенных решений, описанных выше, я обнаружил, что только эти несколько строк будут работать.

cmake_minimum_required (ВЕРСИЯ 3.13)
проект (MyProject)

набор (CMAKE_CXX_STANDARD 11)
add_executable (randomProject main.cpp)

find_package (Boost 1.58.0 ТРЕБУЕМЫЕ КОМПОНЕНТЫ системной файловой системы)
target_link_libraries (myProject $ {Boost_LIBRARIES})