Boost lib linker error Visual C ++
-
05-07-2019 - |
Pregunta
Descargué la fuente para Launchy y estoy intentando construirla en Visual Studio 2005. El proyecto Launchy es Construido con VC7, tuve que actualizar los archivos del proyecto a VC8 y ese proceso pareció ir bien. Sin embargo, Launchy también usa las Boost 1.33.1 libs y lo que he creado son las Boost 1.41.0 libs ( apoyos a Boost por hacer las librerías más recientes mucho más fáciles de construir), así que también actualicé el proyecto para que apunte a mi nueva instalación de librerías de Boost. Ahora recibo el siguiente error de vinculador:
fatal error LNK1104: cannot open file 'libboost_regex-vc80-mt-sgd-1_41.lib'
Eché un vistazo en el directorio lib de Boost y la coincidencia más cercana que pude encontrar es ...
libboost_regex-vc80-mt-gd-1_41.lib
Note los 's' que faltan. No entiendo cuál es la diferencia en libs, y si Visual Studio está buscando algo incorrecto o si mi proceso de compilación de Boost no pudo construir las libs correctas. ¿Alguien puede indicarme la dirección correcta?
Como experimento, hice una copia de la libertad de expresión regular que tengo y la renombré a lo que el vinculador está buscando. Eso me da una larga lista de errores de vinculador sobre los símbolos que ya están definidos en msvcrtd.lib, como los siguientes:
error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) already defined in libcmtd.lib(typinfo.obj)
Intentaré construir las librerías Boost 1.33.1 y apuntar mi archivo de proyecto Launchy a ese lugar. Pero aún me gustaría saber qué es lo que está mal con mis Boost 1.41.0 libs.
Editar : encontré una referencia en los documentos Boost a lo que son las librerías 's:
Utilice esta biblioteca cuando se vincula de forma estática a la biblioteca estándar de C ++ y las bibliotecas de soporte en tiempo de ejecución del compilador.
Así que parece que las librerías 's' son las correctas. Ahora solo tengo que descubrir cómo construirlos.
Solución : pude construir las librerías de refuerzo faltantes con la siguiente línea de comandos.
bjam --build-type=complete msvc stage
Lo encontré después de ejecutar boostrap.bat en el directorio donde vive boost.
Solución
La diferencia es claramente descrita en Boost docs - " mt-sgd " significa "depuración, bibliotecas de tiempo de ejecución vinculadas estáticamente, multiproceso, con símbolos de depuración". " mt-gd " es el mismo, pero utiliza bibliotecas de tiempo de ejecución vinculadas dinámicamente (es decir, msvcrtd.lib en lugar de libcmtd.lib).
Cambie la configuración del proyecto para usar el enlace CRT dinámico (es decir, / MDd en lugar de / MTd), o cree Boost utilizando el enlace estático: mezclarlos no funcionará correctamente.
Otros consejos
¿Qué comando usaste para construir impulso? intente especificar build-type = complete. Normalmente, también debería construir las librerías s.