2010-03-16 12 views
10

Quiero lanzar una aplicación que desarrollé como hobby tanto para Linux como para Windows. Esta aplicación depende del impulso (y posiblemente de otras bibliotecas). La norma para este tipo de aplicación (un motor de ajedrez) es proporcionar solo un archivo ejecutable y posiblemente algunos archivos auxiliares.¿Cuáles son los pro y los contras de vincular estáticamente una biblioteca?

Creo que sería una buena idea vincular estáticamente las bibliotecas para que el ejecutable no tenga ninguna dependencia. Entonces, el usuario final puede simplemente poner el ejecutable en un directorio y comenzar a usarlo.

Sin embargo, mientras hacía algunas investigaciones en línea, encontré algunos comentarios negativos sobre la vinculación estática de bibliotecas, algunos incluso argumentando que una aplicación con bibliotecas estáticamente vinculadas sería difícilmente portátil, lo que significa que solo funcionaría en mi sistema de sistemas muy similares.

¿Cuáles son los pros y los contras de vincular estáticamente la biblioteca?

Ya sé que el ejecutable será más grande. Pero no veo por qué mi aplicación sería menos portátil.

+2

Montones de engaños, incluyendo http://stackoverflow.com/questions/140061/when-to-use-dynamic-vs-static-libraries –

+0

@MathieuL A simple vista, también http://stackoverflow.com/ questions/938992/what-are-the-pros-and-cons-of-using-a-dll parece que aborda la pregunta. Tal vez pueda consultar estos enlaces de SO y/o buscar un poco más en SO, y volver a publicar con una pregunta más precisa si las publicaciones anteriores no responden a sus necesidades específicas. – mjv

Respuesta

5

Pros:
Sin dependencias.

Contras:
Mayor uso de memoria, ya que el sistema operativo ya no puede usar una copia compartida de la biblioteca.
Si la biblioteca necesita ser actualizada, su aplicación necesita ser reconstruida. Esto es doblemente importante para las bibliotecas que luego tienen soluciones de seguridad.

Por supuesto, un problema mayor para la portabilidad es la falta de distribución del código fuente.

+0

Bueno, hay _areas dependencias, a menos que enlaces todo de forma estática (incluida libc), esto es particularmente cierto cuando se usan extensiones de GNU. –

+0

Tal vez "sin dependencias" se debe cambiar a "sin dependencias adicionales de tiempo de ejecución" –

0

Si enlaza las bibliotecas de forma estática, a menos que agregue las capacidades para verificar también el sistema del usuario para las bibliotecas que ha vinculado, está bloqueando su aplicación para usar esas versiones de las bibliotecas hasta que actualice su ejecutable. Se producen agujeros de seguridad y ocurren actualizaciones. (Para un motor de ajedrez puede que no haya demasiados problemas, pero quién sabe).

2

Digamos que la biblioteca estática "A" que incluye tiene una dependencia en la función "B". Si el sistema de destino no puede cumplir esta dependencia, entonces su programa no se ejecutará.

Pero si utiliza enlaces dinámicos, el usuario podría quizás instalar otra versión de la biblioteca "A" que utiliza la función "C" en lugar de "B", por lo que puede ejecutarse correctamente.

+1

¿QUÉ A *? Esto es una tontería completa. El binario estático está completamente vinculado con todo lo que necesita. No tienes necesidad de biblioteca con esos. ¿Cómo se puede aceptar esa respuesta? – morphles

+1

@morphles: una biblioteca enlazada estáticamente no puede contener * todo * (de lo contrario, incluso debería incluir el kernel ;-) –

0

Con bibliotecas vinculadas dinámicamente, si la biblioteca dice X, con la que se ha vinculado no está disponible en el sistema del usuario, su código se bloquea de forma desagradable y el usuario final se pregunta.
Considerando que, en el caso de las bibliotecas estáticas todo se fusiona en el ejecutable, por lo que una condición como la anterior no puede suceder, el ejecutable sin embargo será muy voluminoso.

Sin embargo, el problema anterior en las bibliotecas vinculadas dinámicamente puede eliminarse por dynamic loading.

Cuestiones relacionadas