web-dev-qa-db-fra.com

Erreur liée à l'éditeur de liens: symbole externe non résolu "classe boost :: system :: error_category const & __cdecl boost :: system :: get_system_category (void)"

Je commence tout juste à utiliser Boost pour la première fois. Détails:

  1. J'utilise Visual Studio 2008 SP1
  2. Je fais une construction x64
  3. J'utilise uniquement boost :: asio (et toutes les dépendances dont il dispose)

Mon code est maintenant compilé, et j'ai orienté mon projet vers les librairies boost (après avoir construit les librairies x64) et résolu des problèmes simples.

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)

des idées?


J'ai ajouté cette définition: #define BOOST_LIB_DIAGNOSTIC

Et maintenant, dans ma sortie, je vois ceci:

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

ce qui semble indiquer qu'il s'agit en fait de lien dans le système lib.

27
Alex Black

J'ai résolu le problème. J'avais construit des bibliothèques 32 bits alors que j'avais l'intention de construire des bibliothèques 64 bits. J'ai corrigé mon instruction de construction et construit des bibliothèques 64 bits, et maintenant cela fonctionne.

Voici ma ligne de commande 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
43
Alex Black
#include <boost/system/config.hpp>

Dans mon cas, BOOST_LIB_DIAGNOSTIC n'a pas montré que le système était automatiquement lié. J'ai résolu ce problème en incluant simplement boost/system/config.hpp.

4
Jeffrey Faust

Vous devez créer un lien dans la bibliothèque boost_system

1
Maik Beckmann

J'ai eu le même problème. J'ai essayé tout ce qui est décrit ci-dessus, mais rien n'y fait. La solution était simple: d’abord, j’ai travaillé avec un projet vide et j’ai eu l’erreur de linker LNK2019. Mais lorsque j'ai créé une nouvelle application de console Win32 par défaut avec les fichiers stdafx.h, targetver.h et stdafx.cpp, tout a fonctionné. Peut-être que ce sera utile pour quelqu'un, je passe deux jours pour cela

1
Pavel

Si vous utilisez boost :: system dans votre projet, vous devez utiliser et désigner la version x86 ou x64 de boost :: system lib.

Vous pouvez recompiler la bibliothèque Boost avec le fichier de commandes suivant. Enregistrez-les dans le dossier racine Boost et exécutez-le dans CMD Windows (ne double-cliquez pas sur!):

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

Pour plus d'informations, vous pouvez consulter cet article: https://studiofreya.com/2015/12/19/how-to-build-boost-1-60-with-visual-studio-2015/

1
Protoss

Je suis également venu ici pour cette erreur de l'éditeur de liens plus CMake, mais dans mon cas, c'était le fait que CMake par défaut essaiera de construire avec 32 bits par défaut. Ceci a été corrigé en spécifiant -Ax64

cmake -Ax64 {path to CMakeLists.txt}
0
Joe Staines

Je suis arrivé à la question en recherchant l'erreur de l'éditeur de liens plus CMAKE, alors j'ajoute ce commentaire ici au cas où quelqu'un d'autre trouverait cette question de la même manière.

Il s'est avéré que l'erreur de l'éditeur de liens dans mon cas était due à un errant:

    add_definitions(-DBOOST_ALL_DYN_LINK)

dans le CMakeLists.txt, ce qui convient pour Unix, mais pas Windows dans mon cas. La solution n’est pas l’utilisation qui définit sous Windows.

0
Barry

J'avais besoin des deux versions et de la scène utilisée. J'ai donc utilisé --stagedir =./StageX86 pour la version x86 et la valeur par défaut ./stage pour x64.

0
Eugenio Miró