2009-01-19 20 views
5

¿Cuáles son las mejores prácticas para elegir el método de enlace en VC++? ¿Puede algo/todo estar vinculado estáticamente?Enlace de tiempo de ejecución estático/dinámico

En un proyecto vinculado dinámicamente, ¿es importante la ubicación relativa/absoluta de la biblioteca vinculada?

¿Cuáles son los pros y contras?

añadido: Me refería principalmente a los archivos lib. ¿Se comportan igual que dll linking?

Respuesta

5

Los enlaces dinámicos le permiten actualizar archivos DLL individuales sin volver a compilar sus aplicaciones. Es por eso que las ventanas se pueden actualizar sin que la aplicación se vuelva a compilar, porque el vinculador dinámico puede determinar los puntos de entrada en el dll, siempre que exista el nombre del método.

La vinculación estática de su aplicación tiene la ventaja de que las llamadas al código vinculado no son indirectas, por lo que se ejecutan más rápido. Esto puede tener un impacto en el código dependiente del rendimiento.

El uso de archivos DLL también puede ayudarlo a reducir el espacio de memoria, ya que solo carga las bibliotecas cuando las necesita y puede descargarlas cuando haya terminado (pense en los complementos de la aplicación, solo cargue una biblioteca de exploración de imágenes cuando tenga una imagen abrir, etc.)

EDITAR: Robert Gamble ha agregado un comentario que me perdí: las DLL se cargan en la memoria compartida por todos los procesos en los sistemas operativos. Esto significa que si dos programas (o dos instancias de su programa) usan la misma DLL, usarán la misma DLL cargada en la memoria, lo que reducirá aún más el uso general de la memoria.

+1

+1, buena respuesta. Además, cuando se trata de bibliotecas que usan varias aplicaciones, si se utilizan bibliotecas dinámicas, no es necesario cargar una copia completa de la biblioteca para cada programa, el código ejecutable de la biblioteca se puede compartir entre todos los programas y reducirlo aún más. uso. –

0

La ventaja obvia de dll es que puede actualizar componentes individuales no solo toda la aplicación (en teoría) y compartir componentes comunes (encapsulándolos en dlls). Desafortunadamente, en la práctica, existe una cierta cantidad de enlace entre dll (s) (incluso cuando se define bien). Eso te lleva a tener que actualizar dll en juegos coincidentes y aislar dlls que no funcionan bien juntos.

Si no se hace cuidadosamente la actualización de DLL puede conducir a los problemas conocidos como DLL Hell.

En la vida real, una aplicación tiende a poner todas las DLL que utilizan en el mismo directorio que el ejecutable. Esto permite la actualización pero no promueve el intercambio. La actualización consiste en actualizar conjuntos de DLL en el directorio de la aplicación en sincronización con la DLL en el repositorio central de Windows.

1

DLL puede hacer para los pequeños workingSet tiempo de ejecución, si la aplicación se escribieron de una manera tal como para gestionar el cambio de contexto entre DLL (Por ejemplo, para aplicaciones más grandes, podría dividir la funcionalidad de las aplicaciones en los límites lógicos para ser implementado dentro de archivos DLL autónomos y permitir que el cargador se cargue en tiempo de ejecución).

Si bien es cierto que las DLL se instalan/copian principalmente en la misma carpeta que el .exe, el requisito es cumplir con las reglas de carga de cargadores (que incluye la carpeta del sistema (mala idea), PATH, directorio actual [ver LoadLibrary Documentación de Ayuda API para una descripción completa de la precedencia]).

Has "agregado" un comentario con respecto a los archivos LIB. En TANTO Dinámico como Estático, se vincula usando archivos LIB. Pero en el caso de la carga dinámica, entrega el .exe junto con todas las DLL dependientes (los archivos LIB contienen los puntos de entrada exportados para la DLL correspondiente).

Prefiero las DLL ya que mis aplicaciones tienden a ser más grandes y segmentadas y esto me permite entregar SOLAMENTE esos componentes actualizados (DLL). Incluso separamos la lógica empresarial de la presentación en sus propias DLL [permite la localización de la dll de solo recursos independiente de la lógica.

La programación mediante DLL provoca que se obligue a cumplir el contrato de la clase/método o función exportada.

+0

Las DLL se pueden usar sin una biblioteca de importación. Ver LoadLibrary()/LoadLibraryEx(). –

+0

Dado que la pregunta específicamente sobre el mejor "método de enlace", me apegué a ese contexto. LoadLibrary (EX) se ejecuta en tiempo de ejecución para hacer que el cargador ubique/cargue el archivo DLL en la memoria de procesos y luego se devuelve un puntero a la función exportada que utilizará la aplicación. – SAMills

Cuestiones relacionadas