windows - tag - ¿Debo redistribuir msvcrt.dll con mi aplicación?
tag folders (4)
La respuesta de Chris no debería ser rechazada porque ambas tienen razón.
El asunto es que hay dos conjuntos diferentes de MSVCRT. Un conjunto es msvcrt80.dll, msvcrt90.dll, etc. que viene con Visual Studio. Esto es lo que las personas normalmente usan. Y deben ser redistribuidos, como se dijo en otras respuestas.
El otro es msvcrt.dll (sin números en el nombre del archivo) en la carpeta System32, que está destinado a ser utilizado ÚNICAMENTE por el propio sistema operativo desde hace algún tiempo. Y las aplicaciones nunca deberían reemplazar / reinstalarlo. Sin embargo, algunas aplicaciones sí lo hacen, por algunas razones desea eliminar las dependencias adicionales para instalar. Pero tenga en cuenta que no está garantizado que esté disponible en la futura versión de Windows.
¿Debería redistribuir msvcrt.dll con mi aplicación y usar el DLL privado si algunas de las bibliotecas de la aplicación dependen dinámicamente de msvcrt.dll? Es decir, ¿hay algún problema de incompatibilidad posible con msvcrt.dll del sistema (dll hell)? La aplicación está dirigida a los sistemas de Servidor de Windows.
msvcrt.dll se ha convertido en una parte de hecho de la distribución del sistema operativo. En Windows 98 y 95, y posiblemente en NT4, era posible instalar el sistema operativo sin él, si se eliminaba la aplicación de aplicaciones como WordPad.
Sin embargo, dada su ubicuidad, y el hecho de que desde esos sistemas operativos muy pocos desarrolladores de aplicaciones se han molestado en enviarlo, al menos desde Windows 2000 ha sido una parte oficial del sistema operativo.
El soporte de Microsoft tiene una tool que puede usar para verificar con qué productos se envían los archivos DLL.
Realice una búsqueda como this y puede ver que msvcrt.dll vsrsion 7.0.3790.0 fue parte de la versión de Windows Server 2003.
msvcrt: es una biblioteca dinámica para el tiempo de ejecución de Microsoft Visual C ++.
Hay dos opciones para usar el tiempo de ejecución de C en Windows:
enlazar con libs de tiempo de ejecución estático.
Use la opción/MT
o/MTd
para cl.exe. En este caso, no tendrá ninguna dependencia en la DLL msvcrt y, por lo tanto, no tendrá que redistribuirla. En Visual Studio, haga clic con el botón secundario en Proyecto o Solución, Propiedades> C / C ++ -> Generación de código-> Biblioteca de tiempo de ejecución use depuración multiproceso y multiproceso, respectivamente. Esta es la forma más fácil. La desventaja es que el ejecutable resultante es más grande.enlace con la biblioteca dinámica C Runtime.
/MDd
opción/MD
o/MDd
para cl.exe.
En Visual Studio, haga clic con el botón secundario en Proyecto o Solución, Propiedades> C / C ++ -> Generación de código-> Biblioteca de tiempo de ejecución utilice la función de enlace dinámico multiproceso y la depuración de enlace dinámico multiproceso, respectivamente. Esto da como resultado un EXE más pequeño, pero la desventaja es que debe instalar el MSVCRT requerido al instalar su aplicación.
Cada versión del compilador de VC ++ se envía con una versión del tiempo de ejecución de C (CRT). Visual Studio 2005 se distribuye con la v8 del compilador y la v8 del CRT. La DLL real para v8 era msvcrt80.dll. Para VS2008, era v9, y el CRT dinámico era msvcrt90.dll. Sin embargo, el CRT se actualiza y se aplica un parche con más frecuencia que el compilador C / C ++. Un desarrollador puede descargar un CRT actualizado y construir en contra de eso.
Si compila con la biblioteca CRT dinámica, DEBE descargar un paquete redistribuible para la versión necesaria del tiempo de ejecución de microsoft.com y realizar una instalación (potencialmente silenciosa) durante la instalación de la aplicación.
Antes de VS2005, los desarrolladores creaban aplicaciones para que dependieran del MSVCRT que estaba en el sistema operativo Windows. Esto daría el beneficio de la DLL (tamaño de imagen pequeño) sin incurrir en el requisito de enviar la DLL de CRT en la instalación de la aplicación. Antes de Windoes 2000, los desarrolladores incluso instalarían un nuevo MSVCRT.dll en la carpeta de instalación de / Windows. Pero, compartir el CRT en muchas aplicaciones y el sistema operativo también, resultó ser una muy mala idea. Con WinXP SP2, el CRT incluido con Windows cambió significativamente, y cualquier aplicación que dependiera de esa versión del CRT corría el riesgo de romperse.
En este punto, Microsoft les dice a los desarrolladores que el MSVCRT.dll que se incluye con Windows es parte del sistema operativo y que puede recibir servicio o parche en cualquier momento. No es compatible para crear una aplicación en su contra. Por lo tanto, las aplicaciones deben usar uno de los métodos anteriores.
Referencias
Debe enviar msvcrt con su aplicación. No es una parte garantizada del sistema operativo. Si una versión particular de Windows pasa a tenerlo, es solo porque algo en Windows lo está usando.
Las aplicaciones se rompieron cuando las versiones más nuevas de Windows no contenían los binarios que la gente asumió que venía con Windows. Las aplicaciones se rompieron cuando el usuario optó por no instalar WinFax, lo que significaba que msvcrt no estaba instalado con él.
De Raymond Chen :
Dependiendo de la versión de Windows que esté ejecutando, puede haber una variedad de archivos DLL de soporte para cosas que no son componentes formales del producto, pero que simplemente son compatibles.
...
Este problema persiste hoy. La gente busca entre los archivos binarios que vienen con Windows buscando algo que puedan remora . Y luego se sorprenden cuando esos binarios cambian o desaparecen por completo.
De KB326922 - Redistribución del componente de tiempo de ejecución de C compartido en Visual C ++ :
... la DLL CRT ya no se considera un archivo de sistema, por lo tanto, distribuya la DLL CRT con cualquier aplicación que dependa de ella. Como ya no es un componente del sistema, instálelo en el directorio de Archivos de programa de su aplicación con otro código específico de la aplicación. Esto evita que su aplicación use otras versiones de la biblioteca CRT que pueden instalarse en las rutas del sistema.
Debe enviar msvcrt con su aplicación, si realiza un enlace a MSVCRT .
Más
se tomó la decisión de simplemente darse por vencido y declararlo como una DLL del sistema operativo, para ser utilizada solo por los componentes del sistema operativo.
Aunque
MSVCRT.DLL
ha sido un DLL de sistema operativo durante mucho tiempo, y se ha documentado como fuera de los límites de las aplicaciones , todavía hay muchas personas que lo tratan como un canal de entrega C runtime , y esos programas crean una gran cantidad de duelo por el equipo del producto.
Debe redistribuir el Microsoft Visual C Runtime con su aplicación, ya que Windows no incluye ningún Microsoft Visual C Runtime. Puede haber una DLL llamada msvcrt.dll
(que no está garantizada), no es la MSVCRT.