2009-06-30 11 views
26

Per la prima volta sono appena iniziato con Boost, dettagli:Errore linker boost: simbolo esterno non risolto "class boost :: system :: error_category const & __cdecl boost :: system :: get_system_category (void)"

  1. sto usando Visual Studio 2008 SP1
  2. sto facendo un x 64 costruire
  3. sto usando boost :: asio solo (ed eventuali dipendenze che ha)

Il mio codice ora compila e ho puntato il mio progetto sui librari di boost es (dopo aver costruito librerie x64) e ottenuto questioni semplici passato, ora sto di fronte a un errore del linker:

2>BaseWebServer.obj : error LNK2001: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::get_system_category(void)" ([email protected]@[email protected]@[email protected]@XZ) 
2>BaseWebServer.obj : error LNK2001: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::get_generic_category(void)" ([email protected]@[email protected]@[email protected]@XZ) 

qualche idea?


ho aggiunto questa definizione: #define BOOST_LIB_DIAGNOSTIC

E ora nella mia uscita vedo questo:

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 

che sembra indicare che è infatti il ​​collegamento nella cartella lib del sistema.

risposta

42

ho risolto il problema. Avevo costruito librerie a 32 bit quando avevo intenzione di creare librerie a 64 bit. Ho corretto la mia dichiarazione di build e ho creato librerie a 64 bit, e ora funziona.

Ecco il mio bjam riga di comando:

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 
+0

Puoi testare le tue librerie per la piattaforma corretta con questo: http://stackoverflow.com/questions/6014107/have-a-static-lib-is-there-a-simple-way-to-know-it- is-for-32-bit-or-64-bit –

+1

Prima del modello di indirizzo avevo un '-' che non dovrebbe essere lì. –

+0

Questa è stata una buona fonte d'ispirazione per trovare il mio bug, ero in una situazione alquanto speculare dove ho costruito le librerie boost come x64 ma stavo creando una nuova applicazione come Win32 e cercando di collegarmi a librerie create come x64. Ho dimenticato che i progetti di template in Visual Studio creano configurazioni predefinite che vengono collegate al ConfigurationManager piuttosto che assumendo quale sia la configurazione attuale della soluzione. – jxramos

1

è necessario collegare nella biblioteca boost_system

+1

Non viene collegato automaticamente? Le altre librerie sembrano. Qual è il modo corretto di collegarlo? (Considerate tutte le varianti della libreria, ecc.) –

+0

La cosa divertente è che il primo errore che ho ricevuto è stato: errore fatale LNK1104: impossibile aprire il file 'libboost_system-vc90-mt-1_38.lib'. Mi sono quindi assicurato che la libreria fosse nel percorso lib e se ne andasse. –

+1

Aggiungi la libreria di importazione (boost_system.??.lib) nelle impostazioni del progetto. –

5
#include <boost/system/config.hpp> 

Nel mio caso, BOOST_LIB_DIAGNOSTIC non ha mostrato sistema che viene automaticamente collegato in Ho risolto questo semplicemente includendo boost/system/config.hpp..

0

Sono arrivato alla domanda tramite la ricerca dell'errore del linker più CMAKE, quindi sto aggiungendo questo commento qui nel caso in cui qualcun altro trovi questa domanda allo stesso modo.

Si scopre che l'errore di linker nel mio caso è stato a causa di un errante:

add_definitions(-DBOOST_ALL_DYN_LINK) 

nel CMakeLists.txt, che va bene per Unix, ma non di Windows nel mio caso. La soluzione non è quella che definisce su Windows.

0

avevo bisogno di entrambe le versioni e bersaglio stadio usato, così ho usato --stagedir =./StageX86 per la versione x86 e la ./stage default per x64

1

Se si utilizza boost :: sistema nel progetto , dovresti usare e nominare la versione x86 o x64 di boost :: system lib.

È possibile ricompilare la libreria Boost con il seguente file batch. Salvale nella cartella Boost root ed eseguilo in CMD Windows (non fare doppio clic!):

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 

Per maggiori dettagli, si può vedere questo articolo: https://studiofreya.com/2015/12/19/how-to-build-boost-1-60-with-visual-studio-2015/

0

mi è venuto qui da per questo errore linker più CMake, ma nel mio caso è stato il fatto che CMake per default tenterà per costruire con 32 bit di default. Questo problema è stato risolto specificando -Ax64

cmake -Ax64 {path to CMakeLists.txt} 
1

Ho avuto lo stesso problema. Ho provato tutto descritto sopra, ma niente aiuta. La soluzione era semplice: prima ho lavorato con un progetto vuoto e lì avevo l'errore linker LNK2019. Ma quando ho creato una nuova applicazione di console Win32 predefinita con i file stdafx.h, targetver.h e stdafx.cpp, tutto ha funzionato. Potrebbe essere utile per qualcuno, trascorro due giorni per questo

Problemi correlati