2009-06-30 13 views
26

Estoy empezando con Boost por primera vez, detalles:Boost error de enlazador: Símbolo externo sin resolver "class boost :: system :: error_category const & __cdecl boost :: system :: get_system_category (void)"

  1. estoy usando Visual Studio 2008 SP1
  2. que estoy haciendo un x 64 Construir
  3. estoy usando impulso :: única asio (y cualquier dependencia que tiene)

Mi código ahora compila, y apunté mi proyecto al impulso librari ES (después de haber construido librerías de 64 bits) y nos dieron los conceptos más simples del pasado, ahora me estoy enfrentando un error de vinculador:

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) 

alguna idea?


he añadido esta definición: #define BOOST_LIB_DIAGNOSTIC

Y ahora en mi salida veo esto:

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 

que parece indicar que se trata de hecho de unión en la lib sistema.

Respuesta

42

He resuelto el problema. Construí bibliotecas de 32 bits cuando tenía la intención de construir bibliotecas de 64 bits. Arreglé mi declaración de compilación y construí bibliotecas de 64 bits, y ahora funciona.

Aquí es mi línea de comandos 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 
+0

Puede probar que sus libs son para la plataforma correcta con esto: 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

Antes del modelo de dirección, tenía un '-' que no debería estar allí. –

+0

Esto fue una buena inspiración para encontrar mi error, estaba en una situación un tanto diferente donde construí las bibliotecas de impulso como x64 pero estaba construyendo una nueva aplicación como Win32 y tratando de enlazar a bibliotecas que fueron construidas como x64. Olvidé que los proyectos de plantillas en Visual Studio crean configuraciones predeterminadas que se conectan al ConfigurationManager en lugar de asumir la configuración actual de la solución. – jxramos

1

es necesario enlazar en la biblioteca boost_system

+1

¿No se autoenlaza? Las otras bibliotecas parecen hacerlo. ¿Cuál es la forma correcta de vincularlo? (Dadas todas las variaciones de la biblioteca, etc.) –

+0

Lo curioso es que el primer error que obtuve fue: error fatal LNK1104: no se puede abrir el archivo 'libboost_system-vc90-mt-1_38.lib'. Luego me aseguré de que la biblioteca estuviera en el camino de la lib y desapareció. –

+1

Agregue la biblioteca de importación (boost_system.??lib) a la configuración de su proyecto. –

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

En mi caso, BOOST_LIB_DIAGNOSTIC no mostraron sistema que se vincula automáticamente en resolví esto simplemente incluyendo realce/sistema/config.hpp..

0

Llegué a la pregunta buscando el error del enlazador más CMAKE, entonces estoy agregando este comentario aquí en caso de que alguien más encuentre esta pregunta de la misma manera.

Resulta que el error de vinculador en mi caso se debió a un errante:

add_definitions(-DBOOST_ALL_DYN_LINK) 

en el CMakeLists.txt, lo cual está bien para Unix, pero no en mi caso de Windows. La solución no es el uso que define en Windows.

0

que necesitaba las dos versiones de destino y el escenario utilizado, por lo que utiliza --stagedir =./StageX86 para la versión x86 y el ./stage por defecto para x64

1

Si utiliza impulso :: sistema de en su proyecto , debe usar y asignar la versión x86 o x64 de boost :: system lib.

Puede recompilar la biblioteca Boost con el siguiente archivo por lotes. Guárdelos en la carpeta raíz de Boost y ejecútelos en CMD Windows (¡no haga doble 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 

Para más detalles, se puede ver este artículo: https://studiofreya.com/2015/12/19/how-to-build-boost-1-60-with-visual-studio-2015/

0

también vine aquí a partir de este error enlazador más CMake, pero en mi caso fue el hecho de que CMake por defecto intentará para construir con 32 bits por defecto. Esto se solucionó especificando -Ax64

cmake -Ax64 {path to CMakeLists.txt} 
1

Tuve el mismo problema. Intenté todo lo descrito anteriormente, pero nada ayuda. La solución fue simple: primero trabajé con un proyecto vacío y allí tuve un error de enlazador LNK2019. Pero cuando creé una nueva aplicación de consola Win32 predeterminada con archivos stdafx.h, targetver.h y stdafx.cpp, todo funcionó. Puede ser que sea útil para alguien, gasto dos días para este

Cuestiones relacionadas