Debería enlazar con el tiempo de ejecución de Visual Studio C estática o dinámica?

StackOverflow https://stackoverflow.com/questions/787216

  •  16-09-2019
  •  | 
  •  

Pregunta

He leído argumentos de ambas partes sobre si se debe enlazar a la biblioteca de tiempo de ejecución C estática o dinámica en proyectos de Visual Studio, y todavía no estoy del todo seguro de qué pensar.

Mi proyecto tira en algunas librerías de terceros (Python, HDF5, Trilinos, y Microsoft MPI), cada uno de los cuales tiene que ser construido con la misma biblioteca de tiempo de ejecución como mi ejecutable final (de lo contrario no pueden ser unidos entre sí). Cuando se enlaza estáticamente, cada una de estas bibliotecas contendrá una copia del tiempo de ejecución C. He leído que esta es susceptible de causar problemas porque el ejecutable final contendrá copias múltiples del tiempo de ejecución, ninguno de los cuales pueden interactuar entre sí. Pero no sería el enlazador quejarse si los mismos símbolos se multiplican definen?

Me gustaría evitar el "DLL Hell", pero estoy preocupado por los errores insidiosos que podrían derivarse de enlazado dinámico en múltiples copias del tiempo de ejecución. Estoy leyendo cosas mal?

Además, estoy utilizando Visual Studio 2005 y leí que el Service Pack 1 de tiempo de ejecución no es compatible con versiones anteriores. ¿Esto significa que una aplicación construida sin SP1 no se ejecutará en una máquina que tiene las dlls SP1, incluso si tienen el mismo nombre (por ejemplo msvcr80.dll)?

¿Fue útil?

Solución

La vinculación estática se hinchan todos sus archivos EXE y DLL, y puede causar accidentes (por ejemplo. Si el código en un archivo DLL llama libre () con un puntero asignado por malloc () en un DLL diferente).

Usted puede obtener lo mejor de ambos mundos mediante la vinculación dinámica y el despliegue de las DLL de tiempo de ejecución como asambleas privadas. Esto simplemente significa poner una copia de un directorio con un nombre especial que contiene los archivos DLL de tiempo de ejecución y sus manifiestos al lado de su ejecutable.

Vea la sección "Distribución de Visual C ++ DLL de la biblioteca como asambleas privadas" en http://msdn.microsoft.com/en-us/library/ms235291 (VS.80) .aspx para los detalles, pero básicamente su aplicación se ve así:

c:\Program Files\My App\MyApp.exe
c:\Program Files\My App\MyLibrary.dll
c:\Program Files\My App\Microsoft.VC80.CRT\Microsoft.VC80.CRT.manifest
c:\Program Files\My App\Microsoft.VC80.CRT\msvcr80.dll

En cuanto a su última pregunta, sí, el equipo de destino necesita las versiones correctas de los archivos DLL de tiempo de ejecución para trabajar, sino por su despliegue como conjuntos privados, que garantiza que.

Otra ventaja es que los usuarios no administradores pueden instalar la aplicación (no en Archivos de programa, pero en otros lugares) -. Que no necesitan permiso para escribir archivos en el área WinSxS

Otros consejos

El único momento en que obtendrá múltiples copias del tiempo de ejecución es estáticamente cuando se vincula una biblioteca en un archivo DLL - cada DLL obtendrá una copia, y también lo hará el exe. Si son los bibliotecas estáticas y no DLL, estarán todos juntos y enlace de todas sus bibliotecas a compartir el mismo tiempo de ejecución.

Ese es el trabajo del enlazador.

... Hazlo de forma estática ... intenta solucionar DLL Infierno no han funcionado tan bien ... sólo tiene que añadir un 200k adicional a su instalación con la vinculación estática.

Las librerías estáticas no necesito para ser estáticamente vinculado a otras bibliotecas estáticas. Sólo tiene que conectar todas las bibliotecas estáticas en su proyecto principal. De ese modo el compilador no se quejará de múltiples símbolos.

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