2012-05-17 18 views
7

¿Es posible desarrollar en C/C++ para Windows y no para enlazar con msvcr100.dll?¿Omite el msvcr100.dll al desarrollar en C/C++ para Windows?

Entiendo que esta es la biblioteca c estándar para Windows, pero me preguntaba cómo podrían ejecutarse todos los programas en mi computadora si no tuviera instalado Visual Studio o el paquete redistribuible.

+1

Puede desarrollarse en contra de otras bibliotecas de C++ como Intel o gcc, pero si se vincula dinámicamente a la biblioteca y que no está disponible en tiempo de ejecución, el programa no se ejecutará. El enlace estático funcionaría. – birryree

+0

¿Contra qué biblioteca está Paint etc. vinculado? ¿O están todos vinculados estáticamente con la biblioteca que usan? – Erik

+1

La pintura se desarrolla contra una msvcr anterior y esa ya está instalada en Windows de manera predeterminada. – birryree

Respuesta

16

Haga clic derecho en su proyecto en la ventana del Explorador de soluciones, Propiedades, C/C++, Generación de código, Configuración de biblioteca en tiempo de ejecución. Cambiarlo a/MTd. Repita para la configuración de Release, selección/MT

Ahora enlazará la versión estática de la CRT, cualquier función que utilice se vinculará directamente con su EXE en lugar de obtenerla de msvcr100.dll en tiempo de ejecución. Por lo tanto, ya no tiene el requisito de implementar la DLL junto con su programa.

Evite utilizar esta opción si crea sus propias DLL. Entonces llega a ser importante que esos archivos DLL y el EXE usen exactamente el mismo CRT para que todos compartan el mismo estado de CRT y el mismo montón. Porque si no lo hacen, entonces tendrás problemas desagradables al pasar objetos o punteros C++ que necesitan ser liberados de un trozo de código a otro. Un AccessViolation si tienes suerte, una pérdida de memoria si no lo eres.

+0

Gracias! Eso es – Erik

+0

Los desagradables errores son mucho menos comunes hoy en día, pero sigue siendo un desperdicio de espacio en disco, memoria y caché de CPU tener 20 archivos DLL con una copia del CRT cada uno. – MSalters

+0

Esto no siempre funciona por alguna razón. Por ejemplo, si ya compiló el proyecto al menos una vez, no puede vincularlo así. –

1

En Windows, dudo que sea posible crear un programa no trivial que no utilice el CRT de alguna manera.

Es posible utilizar el CRT sin enlace a msvcrXXX.dll - simplemente enlace a las bibliotecas estáticas en su lugar. Pero para responder a su pregunta:

cómo todos los programas en mi computadora podría funcionar si no hubiera instalado Visual Studio o el paquete redistribuible?

Si los programas de su PC estaban vinculados a msvcrtxxx.dll, entonces no podían. Sin embargo, la redistribución que un programa en particular necesitaba ya estaba instalada en su PC incluso antes de que apareciera, probablemente. O al menos, las partes de la redistribución que necesita el programa.

2

Si restringe su proyecto a utilizar solo el lenguaje de programación C/biblioteca, entonces puede vincular solo contra MSVCRT.lib que está completamente horneado en cualquier versión de Windows desde Windows XP SP3.

Significa que, en lugar de depender de MSVCR100.DLL (o de cualquier otra DLL de Visual Studio), solo puede establecer un enlace contra las funciones C estándar en MSVCRT. Por cierto, this technique se utiliza en el proyecto CoApp desarrollado bajo el paraguas de Microsoft, por lo que lo consideraría una buena práctica en casos como el suyo.

Simplemente, descarga Windows DDK y enlace sólo contra $(DDKInstallPath)lib\Crt\$(DDKPlatform)\msvcrt.lib

+1

Gracias. Eso es realmente muy interesante y más de lo que estaba buscando. – Erik

+0

Esta biblioteca es un detalle de implementación no documentada. Sin embargo, probablemente pueda contar con Microsoft para que lo soporte en el futuro, ya que muchos programas dependen de él por error. Pero ese apoyo será limitado, p. no van a portarlo a 64 bits ya que nunca hubo un VC6 de 64 bits. – MSalters

+0

@MSalters Esto no es cierto, completamente. Instale Windows DDK y revise usted mismo. El DDK proporciona las compilaciones amd64, i386 e ia64 de msvcrt.lib. ¡DDK no está muerto! – mloskot