Pregunta

No sé si es posible hacer esto, pero me gustaría que el / NODEFAULTLIB a ser aplicado a un proyecto de biblioteca estática.

Tengo muchos proyectos de aplicación (a.exe, B.dll, C.dll) que utilizan una biblioteca estática común D.lib. Esta biblioteca tiene una gran cantidad de código y también tiene otras dependencias .lib también. Uno de ellos es la biblioteca OpenSSL, que parece haber sido construida para Win32 contra la versión de lanzamiento del CRT (no tengo los proyectos / fuentes originales).

Hasta el momento, para evitar la mezcla de las versiones Release / depuración de CRT, tengo que poner la directiva enlazador /NODEFAULTLIB:msvcrt.lib en todos los proyectos de la hoja (a.exe, B.dll). Esto funciona, pero creo que no es la forma ideal de hacer frente a esta cuestión. He intentado poner esta propiedad en el proyecto D.lib, pero no tiene ningún efecto.

¿Hay una manera de forzar ++ msvc ignorar la dependencia msvcrt.lib de la biblioteca 3 ª parte?

¿Fue útil?

Solución

A Lib no tiene ninguna configuración de engarce, ya que no lo enlace, que vincular a ella. Un Lib es simplemente un archivo de los archivos .obj, algo así como un archivo .zip sin comprimir -. Es por eso que usted tiene que poner el ajuste en todos los proyectos que enlazan a ella

Si está utilizando VS2005 + se puede utilizar hojas de propiedades para que usted sólo tiene que poner el ajuste en un lugar y luego usar esa hoja de propiedades en todos los proyectos.

Sin embargo, OpenSSL es sólo eso - de código abierto, por lo que debe ser capaz de obtener el código fuente de la versión que está utilizando y construirlo de nuevo (y añadirlo a su sistema de control de versiones, por supuesto). Pensé OpenSSL podría ser construido como un archivo DLL o LIB, que resolvería el problema ya que el DLL no interferiría con la vinculación de su código.

De no ser así, siempre se tiene la opción de rajar su funcionalidad en una DLL independiente de forma que sólo tiene problemas con un proyecto.

Otros consejos

Mi opinión es que si LIB biblioteca vinculada estáticamente en un DLL, el DLL ya contiene todo el código relevante de LIB. Por lo tanto, este acoplamiento no se puede quitar. Esto sólo se basa en mi comprensión de la vinculación estática, no en experimentos.

Para evitar que su librería de enlace estática distribuida de depender de una biblioteca específica de tiempo de ejecución MSVC es necesario establecer esta opción del compilador (en Visual Studio 2010 que parece):

Propiedades de configuración -> C / C ++ -> Avanzado -> Omitir biblioteca por defecto Nombre = Si (/ ZI)

Ahora los usuarios pueden vincular a su liberación construida lib estática de su versión de depuración y no tratar de enlazar a la biblioteca de ejecución incorrecta causando problemas, así como enlaces advertencias.

Tenga en cuenta que puede causar errores de enlace si su biblioteca depende en realidad de una biblioteca de tiempo de ejecución específica o su comportamiento, y los componentes compatibles que no se proporcionan de alguna otra manera.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top