неопределенная ссылка на boost:: system:: system category () при компиляции



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



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



что я делаю не так?

641   9  

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_47

D:/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

    Ничего не найдено.