Ошибка компоновщика Boost:Неразрешенный внешний символ “повышение класса::system::error_category const & __cdecl повышение класса::system::get_system_category(void)”
-
21-08-2019 - |
Вопрос
Я только начинаю работать с Boost в первый раз, подробности:
- Я использую Visual Studio 2008 с пакетом обновления 1
- Я делаю сборку x64
- Я использую только boost:: asio (и любые зависимости, которые у него есть)
Теперь мой код компилируется, и я указал своему проекту на библиотеки boost (после создания библиотек x64) и преодолел простые проблемы, теперь я столкнулся с ошибкой компоновщика:
2>BaseWebServer.obj : error LNK2001: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::get_system_category(void)" (?get_system_category@system@boost@@YAAEBVerror_category@12@XZ)
2>BaseWebServer.obj : error LNK2001: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::get_generic_category(void)" (?get_generic_category@system@boost@@YAAEBVerror_category@12@XZ)
есть какие-нибудь идеи?
Я добавил это определение:#определение BOOST_LIB_DIAGNOSTIC
И теперь в моих выходных данных я вижу это:
1>Linking to lib file: libboost_system-vc90-mt-1_38.lib
1>Linking to lib file: libboost_date_time-vc90-mt-1_38.lib
1>Linking to lib file: libboost_regex-vc90-mt-1_38.lib
что, по-видимому, указывает на то, что это фактическая привязка в системной библиотеке.
Решение
Я решил эту проблему.Я создал 32-разрядные библиотеки, когда намеревался создавать 64-разрядные библиотеки.Я исправил свой оператор сборки и создал 64-разрядные библиотеки, и теперь это работает.
Вот моя командная строка bjam:
C:\Program Files (x86)\boost\boost_1_38>bjam --build-dir=c:\boost --build-type=complete --toolset=msvc-9.0 address-model=64 architecture=x86 --with-system
Другие советы
#include <boost/system/config.hpp>
В моем случае BOOST_LIB_DIAGNOSTIC не показал, что система подключена автоматически.Я решил эту проблему, просто включив boost/system/config.hpp.
Вам нужно создать ссылку в библиотеке boost_system
У меня была такая же проблема.Я перепробовал все описанное выше, но ничего не помогает.Решение было простым:сначала я работал с пустым проектом, и там у меня возникла ошибка компоновщика LNK2019.Но когда я создал новое консольное приложение Win32 по умолчанию с файлами stdafx.h, targetver.h и stdafx.cpp, все заработало.Может быть, это кому-нибудь пригодится, я трачу на это два дня
Если вы используете повышение::система в вашем проекте вы должны использовать и назначить x86 или x64 версию boost::system lib.
Вы можете перекомпилировать библиотеку Boost с помощью следующего пакетного файла.Сохраните их в корневой папке Boost и запустите ее в CMD Windows (не делайте двойной щелчок!).:
call "%VS140COMNTOOLS%..\..\VC\vcvarsall.bat" x86
cd boost_1_60_0
call bootstrap.bat
rem Most libraries can be static libraries
b2 -j8 toolset=msvc-14.0 address-model=64 architecture=x86 link=static threading=multi runtime-link=shared --build-type=minimal stage --stagedir=stage/x64
b2 -j8 toolset=msvc-14.0 address-model=32 architecture=x86 link=static threading=multi runtime-link=shared --build-type=minimal stage --stagedir=stage/win32
pause
Для получения более подробной информации вы можете ознакомиться с этой статьей: https://studiofreya.com/2015/12/19/how-to-build-boost-1-60-with-visual-studio-2015/
Я пришел к вопросу через поиск ошибки компоновщика плюс CMAKE, поэтому я добавляю этот комментарий здесь на случай, если кто-нибудь еще найдет этот вопрос таким же образом.
Оказывается, ошибка компоновщика в моем случае была вызвана ошибочным:
add_definitions(-DBOOST_ALL_DYN_LINK)
в CMakeLists.txt
, что нормально для Unix, но не для Windows в моем случае.Решение заключается не в использовании этого определения в Windows.
Мне нужны были обе версии, и я использовал stage target, поэтому я использовал --stagedir=./stageX86 для версии x86 и значение по умолчанию ./stage для x64
Я также пришел сюда из-за этой ошибки компоновщика плюс CMake, но в моем случае это был тот факт, что CMake по умолчанию попытается выполнить сборку с 32-битным по умолчанию.Это было исправлено путем указания -Ax64
cmake -Ax64 {path to CMakeLists.txt}