Я пытаюсь включить Boost
библиотеки в моем проекте и сталкивались с проблемами в том же. Я нахожусь на Ubuntu 12.10 с IDE Codeblocks и пытался установить библиотеки вручную, читая инструкции с сайта, но получал сообщения об ошибках с заголовком, а также с библиотеками, которые будут созданы перед использованием.
Затем я установил библиотеки через терминал 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 на 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
Вы должны ссылку в libboost_system
библиотека. Я не уверен насчет кодовых блоков, но опция командной строки g ++ на вашей платформе будет
-lboost_system
В зависимости от буст-версии libboost-system поставляется с суффиксом -mt, который указывает на возможность многопоточности библиотек.
Так что если -lboost_system
компоновщик не может найти -lboost_system-mt
,
Это проблема компоновщика. Включите статический путь к библиотеке в ваш проект.
Для 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
на виджет Текст библиотеки ссылок и нажмите Хорошо кнопка.
Я также искал решение, и ни один из ответов, с которыми я столкнулся, не устранил ошибку, пока я не нашел ответ «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})
Та же проблема при создании простого примера надстройки, решенная после того, как я изменил флаг компилятора g ++ с -станд = C ++ 14 в -станд = C ++ 11.
И я заметил, что это пример C ++ 11 …
это ответ фактически помогло при использовании 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()
Вы можете столкнуться с другой проблемой. После установки 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
Для получения дополнительной информации см. этот вопрос.
У меня была такая же проблема, а также использовать Linux Mint (как nuduoz). Я решил проблему с моим делом после того, как добавил boost_system
в GCC C++ Linker->Libraries
,