C ++ Boost: невизначене посилання на boost :: system :: generic_category ()


92

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

Потім я встановив бібліотеки через 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 на 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

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

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

@pyCthon: Comiler - це Gcc. Я досі не писав жодного коду, але намагався включити Boost filesystem library(operation.hpp у вищезазначеному повідомленні)
Шифр

це працює, компілюючи звичайну програму з бібліотекою boost файлової системи з командного рядка з g ++?
pyCthon

Відповіді:


141

Ви повинні зробити посилання в libboost_systemбібліотеці. Я не впевнений у блоках коду, але опція командного рядка g ++ на вашій платформі буде такою

-lboost_system


Однак я вже знайшов прапор компонувальника. Не вдається змусити його працювати в Codeblocks.
Cipher

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

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

Нема проблем. Оновлено також у дописі
Cipher

у мене така ж проблема, як у шифру, просто в моєму випадку я маю справу з boost / asio.hpp. Я отримую ці помилки s1.directupload.net/images/130608/koyvqpdp.jpg при спробі компілятора. Коли я намагаюся додати -lboost_system, там пише "не вдається знайти lboost_system". В чому проблема?
ddacot

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

Для Codeblocks відкрийте 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). I моя проблема вирішена після того, як я додав 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

Якщо бібліотека не встановлена, слід надати папку бібліотек підвищення:

приклад:

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.