Я пытаюсь скомпилировать программу на Ubuntu 11.10, которая использует библиотеки Boost. У меня установлены библиотеки Boost 1.46-dev из репозитория Ubuntu, но я получаю сообщение об ошибке при компиляции программы.
undefined reference to boost::system::system_category()
Что я делаю не так?
Ответы:
Библиотека boost, которую вы используете, зависит от библиотеки boost_system. (Не все из них.)
Предполагая, что вы используете gcc, попробуйте добавить
-lboost_system
в командную строку вашего компилятора, чтобы связать его с этой библиотекой.источник
-lboost_system
, так это выглядело так:sslsniff_LDFLAGS = -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp -lboost_system
. Но это не помогло ...autoreconf
потом бежали ? Кроме того , этот пост и это один может помочь вам с вашей конфигурацией Autotools.sslsniff_LDFLAGS
сsslsniff_LDADD
в Makefile.am и это не сработало. Потом я сохранил обаsslsniff_LDFLAGS
и добавилsslsniff_LDADD = -lboost_system -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp
. Потом я смог скомпилировать. Спасибо вам за помощь!Связывание с библиотекой , которая определяет недостающий символ (
-lboost_system
) является очевидным решением, но в данном конкретном случае Boost.System, ошибочная особенность в оригинальном дизайне делает его использоватьboost::system::generic_category()
иboost::system::system_category()
без необходимости. Компиляция с флагом-DBOOST_SYSTEM_NO_DEPRECATED
отключает этот код и позволяет нескольким программам компилироваться без необходимости-lboost_system
(эта ссылка, конечно, все еще необходима, если вы явно используете некоторые функции библиотеки).Начиная с Boost 1.66 и этого коммита , это поведение теперь является значением по умолчанию, поэтому, надеюсь, все меньше и меньше пользователей будут нуждаться в этом ответе.
Как заметил @AndrewMarshall, альтернативой является определение,
BOOST_ERROR_CODE_HEADER_ONLY
которое включает версию кода только для заголовков. Это был обескуражен буста , как это может нарушить некоторые функциональные возможности . Однако, начиная с версии 1.69, по-видимому, по умолчанию используется только заголовок, что , предположительно, делает этот вопрос устаревшим.источник
BOOST_ERROR_CODE_HEADER_ONLY
.Еще один обходной путь для тех, кому не нужен весь шебанг: используйте переключатель
-DBOOST_ERROR_CODE_HEADER_ONLY
.Если вы используете CMake, это
add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)
.источник
Вышеупомянутая ошибка является ошибкой компоновщика ... компоновщик - это программа, которая берет один или несколько объектов, сгенерированных компилятором, и объединяет их в одну исполняемую программу.
Вы должны добавить
-lboost_system
к вам флаги компоновщика, которые указывают компоновщику, что он должен искать символы, какboost::system::system_category()
в библиотекеlibboost_system.so
.Если у вас есть main.cpp, либо:
ИЛИ
источник
При использовании CMAKE и find_package убедитесь, что это:
и нет
Некоторые люди могли потерять из-за этого часы ...
источник
У меня та же проблема:
Решением было использовать отладочную версию системной библиотеки:
Но почему?
источник
Когда у меня возникла эта проблема, причиной был порядок библиотек. Чтобы исправить это, я поставил
libboost_system
последним:Это было на mingw с gcc 5.3 и boost 1.61.0 с простым примером таймера.
источник
в моем случае добавления
-lboost_system
было недостаточно, он все еще не мог найти его в моей пользовательской среде сборки. Мне пришлось воспользоваться советом Избавьтесь от «gcc - / usr / bin / ld: warning lib not found» и измените мою./configure
команду на:для получения дополнительных сведений см. Boost 1.51: «ошибка: не удалось связать с boost_thread!»
источник
... и если вы хотите связать свой основной статически, добавьте в свой Jamfile следующие требования:
и, возможно, также:
источник