error fatal LNK1104: no se puede abrir el archivo 'libboost_system-vc110-mt-gd-1_51.lib'

88

Parece que no puedo hacer que esto funcione. Hice una aplicación de consola simple (que depende de la websocket++biblioteca) que necesita Boostbibliotecas ... pero cuando intento compilar obtengo:

error fatal LNK1104: no se puede abrir el archivo 'libboost_system-vc110-mt-gd-1_51.lib'

Sin embargo, hice el bjam que creó la biblioteca y vinculé (boost_root)/stage/libsla ruta de las bibliotecas al compilador C++/Additionnals includes.

Si miro en (boost_root)/stage/libsel archivo libboost_system-vc110-mt-gd-1_51.libno está allí. En su libboost_system-vc110-mt-sgd-1_51.liblugar se llama .

¿Alguna idea?

Rushino
fuente
1
He podido compilar el archivo libboost_system-vc110-mt-gd-1_51.lib haciendo una compilación completa con bjam, sin embargo, sigo recibiendo el error.
Rushino
22
Abra VS2012 developer command prompt, vaya a su directorio raíz de impulso y escriba bootstrap, y luego escriba b2y debería obtener un conjunto completo de archivos de biblioteca.
Jesse Good
¿Agregó las rutas de inclusión y las rutas del vinculador a su proyecto?
Jesse Good
1
¿Estás construyendo tu aplicación con /MD?
Mahesh
Si está bien descargar en lugar de compilar, obtenga las bibliotecas desde aquí: code.ingres.com/boostlib/trunk/stage/lib
gorogm

Respuestas:

93

El parámetro C ++ → General → Incluir directorios adicionales es para enumerar directorios donde el compilador buscará archivos de encabezado.

Debe indicarle al vinculador dónde buscar bibliotecas para vincular. Para acceder a esta configuración, haga clic con el botón derecho en el nombre del proyecto en la ventana del Explorador de soluciones , luego Propiedades → Vinculador → General → Directorios de bibliotecas adicionales . Ingresa <boost_path>\stage\libaquí (esta es la ruta donde se encuentran las bibliotecas si creas Boost usando las opciones predeterminadas).

Pretoriano
fuente
¿Puedes explicarme qué es boost_path?
ggsmartboy
1
@ggsmartboy Es la ruta donde se encuentran los archivos de origen de boost (la misma ruta que enumeras en el compilador incluye rutas para que pueda encontrar los encabezados de boost). La respuesta asume que creaste boost tú mismo (sin usar una distribución) usando las opciones de compilación predeterminadas.
Pretoriano
Increíble. También me salvó un verdadero dolor de cabeza. Por qué parecía incapaz de detectar esto en la documentación de boost (si es que está allí), ¡no lo sé! :)
absentmindeduk
2
La configuración a la que se hace referencia en esta respuesta se encuentra si hace clic derecho en el proyecto y elige propiedades (para novatos como yo, haga clic derecho en la solución, vaya a Herramientas> Opciones, etc. Sin embargo, esas opciones no estaban presentes en todos mis proyectos). VS2013
Mr_and_Mrs_D
1
@Mr_and_Mrs_D Tienes razón, asumí que el lector conocía esa parte. Actualizado.
Pretoriano
97

Esta es la forma más sencilla para un aficionado como yo que está estudiando C ++ por su cuenta:

Primero descomprima la biblioteca de impulso en cualquier directorio de su elección. Recomiendo c:\directory.

  1. Abra su C ++ visual.
  2. Crea un nuevo proyecto.
  3. Haz clic derecho en el proyecto.
  4. Haga clic en propiedad.
  5. Haga clic en C / C ++.
  6. Haga clic en general.
  7. Seleccionar biblioteca de inclusión adicional.
  8. Incluya el destino de la biblioteca. ej c:\boost_1_57_0.
  9. Haga clic en el encabezado del precompilador.
  10. Haga clic en crear / usar encabezado precompilado.
  11. Seleccione no usar encabezado precompilado.

Luego, vaya a la biblioteca de enlaces donde experimentó sus problemas.

  1. Vaya a donde estaba el archivo extraído c:\boost_1_57_0.
  2. Haga clic en booststrap.bat(no se moleste en escribir en la ventana de comandos, solo espere y no cierre la ventana que es el lugar donde tuve mi problema que me tomó dos semanas resolver. Después de un tiempo, booststrapse ejecutará y producirá el mismo archivo, pero ahora con dos nombres diferentes:, b2y bjam.
  3. Haga clic en b2y espere a que se ejecute.
  4. Haga clic en bjamy espere a que se ejecute. Entonces se producirá una carpeta llamada stage.
  5. Haz clic derecho en el proyecto.
  6. Haga clic en propiedad.
  7. Haga clic en vinculador.
  8. Haga clic en general.
  9. Haga clic en incluir directorio de biblioteca adicional.
  10. Seleccione la parte de la biblioteca, por ejemplo c:\boost_1_57_0\stage\lib.

¡Y listo!

Wu Jie
fuente
3
Muchas gracias Wu Jie. Nunca había hecho algo como esto antes y estos pasos eran exactamente lo que necesitaba para construir Boost y producir el archivo de biblioteca 'libboost_serialization-vc140-mt-gd-1_57.lib' que faltaba y que tenía problemas para vincular: )
Vixxd
5
Gracias, me gustan las buenas instrucciones detalladas. Para el paso 2/3/4 de la configuración de boost, lo que hice fue: a) abrir una línea de comandos como root ; b) cambie al directorio boost_1_57_0; c) tipo bootstrap.bat(tomó 10-20 segundos); d) escriba ./b2según las instrucciones (luego tardó entre 30 y 40 minutos en completarse).
Darren Cook
1
Tuve que abrir bootstrap.bat usando el símbolo del sistema de Visual Studio, ya que el símbolo del sistema normal no sabía cómo procesar el comando 'cl'.
jlaverde
20/02/2018, su solución me funciona (VS2017 + Boost 1.66). Muchas gracias.
CaTx
Gracias por los pasos para principiantes. Ojalá todos dieran siempre respuestas como tú las has dado.
Mudit Jain
6

Yo tuve el mismo problema. Fue causado porque compilé el Boost con Visual C ++ 2010 (v100) e intenté usar la biblioteca con Visual Studio 2012 (v110) por error.

Entonces, cambié las configuraciones (en Visual Studio 2012) yendo a Propiedades del proyecto -> General -> Plataform Toolset y cambié el valor de Visual Studio 2012 (v110) a Visual Studio 2010 (v100) .

Jota Santos
fuente
7
Espero que se dé cuenta de que cuando cambia el conjunto de herramientas de la plataforma para usar v100, le está diciendo al IDE de VS2012 que use el compilador que se envió con VS2010. Las características de C ++ 11 que se agregaron al compilador VS2012 no estarán disponibles. Una mejor solución es compilar Boost usando el compilador VS2012; puede hacer que las bibliotecas generadas de 2010 y 2012 coexistan porque Boost coloca el número de versión del compilador en los nombres de archivo de salida.
Pretoriano
Tienes razón y soy consciente. Tengo miedo de lo que pueda suceder si actualizo las bibliotecas y el compilador. Entonces, cuando el proyecto esté terminado, arreglaré todas estas cosas. ¡Gracias!
Jota Santos
6

Otra solución más:

Estaba perplejo porque estaba incluyendo boost_regex-vc120-mt-gd-1_58.lib en mi propiedad Link-> Additional Dependencies, pero el enlace seguía diciéndome que no podía abrir libboost_regex-vc120-mt-gd-1_58.lib ( tenga en cuenta el prefijo lib). No especifiqué libboost_regex-vc120-mt-gd-1_58.lib.

Estaba tratando de usar (y había construido) las bibliotecas dinámicas de impulso (.dlls) pero no tenía definida la macro BOOST_ALL_DYN_LINK. Aparentemente, hay sugerencias en la compilación para incluir una biblioteca, y sin BOOST_ALL_DYN_LINK busca la biblioteca estática (con el prefijo lib), no la biblioteca dinámica (sin un prefijo lib).

wdtj
fuente
¡¡Todavía solo 1 voto a favor, sin embargo, me encuentro aquí cada pocos meses, recordando nuevamente cuál es la solución a mi problema !!
Neil Gatenby
3

Tuve el mismo problema y mi error fue que había instalado el binario boost_1_55_0-msvc-11.0-32.exe para usar con visual c ++ 2010 que tiene la versión v100 (propiedades del proyecto-> ConfiguratioProperties-> General-> platformTooset) no v110 como visual c ++ 2012. Así que descargué boost_1_55_0-msvc-10.0-32.exe y ahora todo está bien hasta ahora.

Plinio
fuente
2

En caso de que tenga problemas para crear boost o prefiera no hacerlo, una alternativa es descargar los archivos lib de SourceForge . El enlace lo llevará a una carpeta de archivos lib y dll comprimidos para la versión 1.51. Sin embargo, debería poder editar el enlace para especificar la versión de su elección. Aparentemente, el instalador de BoostPro tiene algunos problemas.

Bob Bryan
fuente
2

Tuve un problema similar al intentar usar las pruebas unitarias de impulso en Visual Studio 2015 (Community Edition):

error fatal LNK1104: libboost_unit_test_framework-vc140-mt-1_57

así que pensé en compartir mi solución.

Puede crear un proyecto de prueba de unidad de impulso de dos maneras (y esta solución funciona para ambas):

  1. usando el adaptador de prueba de la unidad Boost
  2. o creando una aplicación de consola Win32 ( pasos aquí ) y sustituyendo la función principal con una función de prueba de unidad de impulso ( pasos aquí ).

Estos son los pasos que seguí para que ambos proyectos funcionen:

Primero, descargue la versión de refuerzo deseada (por ejemplo, boost_1_57_0 ). Puede descargar boost con los binarios correctos (compilados con msvc v140) o extraer los binarios usted mismo ejecutando los siguientes comandos desde la línea de comandos:

  1. bootstrap.bat
  2. "C: \ Archivos de programa (x86) \ Microsoft Visual Studio 14.0 \ VC \ vcvarsall.bat" x86
  3. bjam --limpio
  4. bjam -j4 --debug-symbols = on --build-type = conjunto de herramientas completo = msvc-14.0 threading = multi runtime-link = modelo de dirección compartida = 32

Donde msvc-14.0 especifica que requerimos la versión de Visual Studio 2015 (VS 2015 = v14.0 = v140), y address-model = 32 especifica que requerimos la plataforma 32 (pero se puede hacer lo mismo para 64 bits).

Una vez que tenga los binarios, vaya a Visual Studio, seleccione el proyecto Boost Unit Testing que ha creado. Vaya a Propiedades del proyecto> configuración (desde el menú principal) y elija las siguientes opciones:

  • Establezca " General> Conjunto de herramientas de plataforma " en Visual Studio 2015 (v140).

  • Incluya la ruta a la carpeta boost (por ejemplo, C: \ boost_1_57_0) y la ruta a la subcarpeta que contiene los archivos binarios (por ejemplo, C: \ boost_1_57_0 \ stage \ lib) en:

    • " C \ C ++> Directorio de inclusión adicional "
    • y " Vinculador> Directorios de bibliotecas adicionales ".
Aciel
fuente
1

b2 -j% cores% toolset =% msvcver% address-model = 64 architecture = x86 link = static threading = multi runtime-link = shared --build-type = minimal stage --stagedir = stage / x64

Propiedades → Vinculador → General → Directorios de bibliotecas adicionales $ (BOOST) \ stage \ x64 \ lib

Dmitry Ivanov
fuente
Un poco más de elaboración sobre qué están haciendo esas líneas y por qué -> ayudaría a mejorar la calidad de esta respuesta.
Anton Menshov
0

Tuve el mismo problema reportado aquí. Resolví el problema moviendo mainTest.cpp de una subcarpeta src / mainTest / a la carpeta principal src / Supongo que este también era tu problema.

fiorentinoing
fuente
0

2>LINK : fatal error LNK1104: cannot open file 'libboost_regex-vc120-mt-sgd-1_55.lib

En mi caso, bootstrap / bjam no estaba disponible (las bibliotecas fueron precompiladas y comprometidas con SCM) en el antiguo proyecto heredado. Las bibliotecas no tenían versiones VC o BOOST en sus nombres de archivo, por ejemplo:, libboost_regex-mt-sgd.libsin embargo, de Processed /DEFAULTLIB:libboost_regex-vc120-mt-sgd-1_55.libalguna manera se activaban automáticamente.

Se corrigió agregando manualmente el nombre de archivo no versionado a:

<AdditionalDependencies>$(DK_BOOST)\lib64\libboost_regex-mt-sgd.lib</AdditionalDependencies>

y poner ...vc120-mt-sgd-1_55.liben lista negra a los

<IgnoreSpecificDefaultLibraries>libboost_regex-vc120-mt-sgd-1_55.lib</IgnoreSpecificDefaultLibraries>
kevinf
fuente