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

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

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

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

-DBOOST_ERROR_CODE_HEADER_ONLY.

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

Ответ 4

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

Вы должны добавить '-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

Ответ 5

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

find_package(Boost COMPONENTS system ...)

а не

find_package(Boost COMPONENTS system ...)

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

Ответ 6

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

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): undefined ссылка на `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

Но почему?

Ответ 7

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

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 с простым примером таймера.

Ответ 8

в моем случае, добавление -lboost_system было недостаточно, оно все еще не могло найти его в моей настраиваемой среде сборки. Мне пришлось использовать совет Избавиться от "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: "ошибка: не удалось связать с boost_thread!"

Ответ 9

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

<link>static
<library>/boost/system//boost_system

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

<linkflags>-static-libgcc
<linkflags>-static-libstdc++