неопределенная ссылка на boost:: system:: system category () при компиляции
Я пытаюсь скомпилировать программу на Ubuntu 11.10, которая использует библиотеки Boost. У меня есть библиотеки 1.46-dev Boost из репозитория Ubuntu, но я получаю ошибку при компиляции программы.
undefined reference to boost::system::system_category()
что я делаю не так?
9 ответов:
библиотека boost, которую вы используете, зависит от библиотеки boost_system. (Не все из них это делают.)
предполагая, что вы используете GCC, попробуйте добавить
-lboost_systemв командной строке компилятора, чтобы связать с этой библиотекой.
связывание с библиотекой, которая определяет отсутствующий символ (
-lboost_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.СРР, либо:
g++ main.cpp -o main -lboost_systemили
g++ -c -o main.o main.cpp g++ main.o -lboost_system
еще один обходной путь для тех, кому не нужен весь shebang: используйте переключатель
-DBOOST_ERROR_CODE_HEADER_ONLY.Если вы используете CMake, это
add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY).
у меня та же проблема:
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_47D:/bfs_ENTW_deb/obj/test/main_filesystem.obj: main_filesystem.СРР.(:текст+0x54): неопределенная ссылка на ' boost:: system:: generic_category()
решение было использовать отладочную версию системы-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 ...)некоторые люди, возможно, потеряли часа ...
когда у меня была эта проблема, причиной был заказ из библиотеки. Чтобы исправить это, я поставил
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 с простым примером таймера.
в моем случае, при добавлении
-lboost_systemбыло недостаточно, он все еще не мог найти его в моей пользовательской среде сборки. Я должен был использовать совет в избавиться от "gcc - / usr / bin/ld: предупреждение lib не найден" и в:./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 !"
...и в случае, если вы хотите связать свой основной статически, в вашем Jamfile добавьте следующее к требованиям:
<link>static <library>/boost/system//boost_systemи, возможно, также:
<linkflags>-static-libgcc <linkflags>-static-libstdc++
Comments