Ошибка компоновщика Boost:Неразрешенный внешний символ “повышение класса::system::error_category const & __cdecl повышение класса::system::get_system_category(void)”

StackOverflow https://stackoverflow.com/questions/1066071

Вопрос

Я только начинаю работать с Boost в первый раз, подробности:

  1. Я использую Visual Studio 2008 с пакетом обновления 1
  2. Я делаю сборку x64
  3. Я использую только 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}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top