C ++ Boost: неопределенная ссылка на boost :: system :: generic_category ()


92

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

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

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

Я не уверен, как исправить эту ошибку (особенно в кодовых блоках в 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

вы не связали его правильно,
кодовые блоки

@pyCthon: в этом случае не могли бы вы добавить более подробную информацию о том, как связать это в Code :: blocks. Я попытался добавить флаг компоновщика -lboost_systemв какое-то место в настройках, но он не разрешился. Тем не менее, я даже не уверен, что сделал все, что связано с флагом компоновщика, в нужном месте. Немного подробностей было бы очень полезно.
Cipher

ну какой компилятор вы используете? mingw? gcc? какой код вы пытаетесь запустить? приведу пример .....
pyCthon

@pyCthon: Comiler - это Gcc. Я не писал никакого кода до сих пор, но попытался включить Boost filesystem library(operation.hpp в вышеуказанный пост)
Cipher

работает ли компиляция обычной программы с библиотекой файловой системы boost из командной строки с g ++?
pyCthon

Ответы:


141

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

-lboost_system


Я уже обнаружил, что нужно добавить флаг компоновщика. Не могу заставить его работать в кодовых блоках.
Cipher

@Cipher можно ли получить команды сборки и связывания, выполняемые кодовыми блоками?
juanchopanza

@Cipher извините, pastebin заблокирован на работе. Я могу проверить позже, но это займет несколько часов.
juanchopanza

Нет проблем. Обновлено и в посте
Cipher

У меня та же проблема, что и у Cipher, только в моем случае я имею дело с boost / asio.hpp. Я получаю эту ошибку s1.directupload.net/images/130608/koyvqpdp.jpg при попытке компиляции. Когда я пытаюсь добавить -lboost_system, он говорит «не могу найти lboost_system». В чем проблема?
ddacot 08

21

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

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


1
Это работает, потому что для этих версий повышения фактическое имя файла библиотеки имеет -mtсуффикс.
tssch

9

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

Для 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кнопку.


7

Я тоже искал решение, и ни один из ответов, с которыми я столкнулся, не помог устранить ошибку, пока я не нашел ответ «ViRuSTriNiTy» в этом потоке: Неопределенная ссылка на 'boost :: system :: 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 и 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()

4

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

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


Это решило мою проблему. Очень легко забыть о флагах, используемых во время компиляции, особенно если вы используете флаги по умолчанию.
Филипе Каласанс

3

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


1

Вы могли столкнуться с другой проблемой. После установки Boost на Linux Mint у меня возникла та же проблема. Связывание -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

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


1

Если библиотека не установлена, вы должны указать папку с библиотеками boost:

пример:

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


0

пытаться

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'чтобы найти расположение библиотеки ускорения


0

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

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


0

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

Я использую Ubuntu 16.04.

cmake_minimum_required (ВЕРСИЯ 3.13)
(myProject)

установить (CMAKE_CXX_STANDARD 11)
add_executable (myProject main.cpp)

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.