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++