undefined ссылка на boost :: system :: system_category () при компиляции

Я пытаюсь скомпилировать программу на Ubuntu 11.10, которая использует библиотеки Boost. У меня есть библиотеки 1.46-dev Boost из Ubuntu Repository, но я получаю сообщение об ошибке при компиляции программы.

undefined reference to boost::system::system_category()

Что я делаю неправильно?

9 Solutions collect form web for “undefined ссылка на boost :: system :: system_category () при компиляции”

Библиотека ускорения, которую вы используете, зависит от библиотеки boost_system. (Не все они делают.)

Предполагая, что вы используете gcc, попробуйте добавить -lboost_system в свою командную строку компилятора, чтобы связать ее с этой библиотекой.

Связывание с библиотекой, которая определяет недостающий символ ( -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 которое допускает версию кода только для заголовка. Однако это не рекомендуется Boost, так как это может нарушить некоторые функции.

Вышеупомянутая ошибка является ошибкой компоновщика … компоновщик – программа, которая принимает один или несколько объектов, сгенерированных компилятором, и объединяет их в одну исполняемую программу.

Вы должны добавить ‘-l boost_system’ вам флагов компоновщика, который указывает компоновщику, что он должен искать символы, такие как boost::system::system_category() в библиотеке libboost_system.so

Если у вас есть main.cpp, либо:

 g++ main.cpp -o main -lboost_system 

ИЛИ

 g++ -c -o main.o main.cpp g++ main.o -lboost_system 

У меня та же проблема:

 g++ -mconsole -Wl,--export-all-symbols -LC:/Programme/CPP-Entwicklung/MinGW-4.5.2/lib -LD:/bfs_ENTW_deb/lib -static-libgcc -static-libstdc++ -LC:/Programme/CPP-Entwicklung/boost_1_47_0/stage/lib \ D:/bfs_ENTW_deb/obj/test/main_filesystem.obj \ -o D:/bfs_ENTW_deb/bin/filesystem.exe -lboost_system-mgw45-mt-1_47 -lboost_filesystem-mgw45-mt-1_47 

D: /bfs_ENTW_deb/obj/test/main_filesystem.obj: main_filesystem.cpp :(. Текст + 0x54): неопределенная ссылка на `boost :: system :: generic_category ()

Решение заключалось в использовании debug-версии system-lib:

 g++ -mconsole -Wl,--export-all-symbols -LC:/Programme/CPP-Entwicklung/MinGW-4.5.2/lib -LD:/bfs_ENTW_deb/lib -static-libgcc -static-libstdc++ -LC:/Programme/CPP-Entwicklung/boost_1_47_0/stage/lib \ D:/bfs_ENTW_deb/obj/test/main_filesystem.obj \ -o D:/bfs_ENTW_deb/bin/filesystem.exe -lboost_system-mgw45-mt-d-1_47 -lboost_filesystem-mgw45-mt-1_47 

Но почему?

При использовании CMAKE и find_package убедитесь, что это:

 find_package(Boost COMPONENTS system ...) 

и не

 find_package(boost COMPONENTS system ...) 

Некоторые люди, возможно, потеряли часы для этого …

Другим обходным решением для тех, кому не нужен весь shebang: используйте переключатель

-DBOOST_ERROR_CODE_HEADER_ONLY .

Если вы используете CMake, это add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY) .

в моем случае добавить -lboost_system было недостаточно, он все еще не мог найти его в моей настраиваемой среде сборки. Мне пришлось использовать совет в Get rid from gcc – / usr / bin / ld: warning lib not found и изменить команду ./configure для:

 ./configure CXXFLAGS="-I$HOME/include" LDFLAGS="-L$HOME/lib -Wl,-rpath-link,$HOME/lib" --with-boost-libdir=$HOME/lib --prefix=$HOME 

подробнее см. Boost 1.51: «error: не удалось связать с boost_thread!»

Когда у меня возникла эта проблема, причиной было упорядочение библиотек. Чтобы исправить это, я поставил libboost_system последним:

 g++ mingw/timer1.o -o mingw/timer1.exe -L/usr/local/boost_1_61_0/stage/lib \ -lboost_timer-mgw53-mt-1_61 \ -lboost_chrono-mgw53-mt-1_61 \ -lboost_system-mgw53-mt-1_61 

Это было на mingw с gcc 5.3 и boost 1.61.0 с простым примером таймера.

… и если вы хотите связать свой основной статически, в вашем Jamfile добавьте следующие требования:

 static /boost/system//boost_system 

и, возможно, также:

 -static-libgcc -static-libstdc++ 
  • статическая функция в C
  • Как я могу поместить int с ведущими нулями при использовании оператора cout <<?
  • как запустить winform из консольного приложения?
  • Должен ли оператор << быть реализован как друг или как функция-член?
  • Как работают classы атрибутов?
  • Использование fflush (stdin)
  • Предоставляет ли компилятор возможность переработать освобожденные переменные указателя?
  • Нельзя передать временный объект в качестве ссылки
  • Значение аббревиатуры SSO в контексте std :: string
  • Получение информации о последовательном порту
  • С Rx, как игнорировать все, кроме самого последнего значения, когда мой метод Subscribe запущен
  • Давайте будем гением компьютера.