2010-01-19 9 views
13

Voy a comenzar un nuevo proyecto de C++ que se basará en una serie de bibliotecas, incluida parte de las bibliotecas de Boost, log4cxx o la biblioteca de registro de Google, y a medida que el proyecto evoluciona también otras (que aún no puedo) prever).Aplicación C++: ¿debo usar enlaces estáticos o dinámicos para las bibliotecas?

Tendrá que ejecutarse en sistemas de 32 y 64 bits, muy probablemente en un entorno Linux bastante diverso en el que no espero tener todas las bibliotecas necesarias ni privilegios.

Mi pregunta es, ¿debo compilar mi aplicación enlazando dinámicamente o estáticamente a todas estas bibliotecas?

Notas:

(1) Soy consciente de la vinculación estática podría ser un dolor durante el desarrollo (ya los tiempos de compilación, compilación cruzada para ambos 32 y 64 bits, bajando cadenas de dependencia para incluir todas las bibliotecas, etc.), pero es mucho más fácil durante la prueba: simplemente mueva el archivo y ejecútelo.

(2) Por otro lado, las uniones dinámicas son más fáciles durante la fase de desarrollo - tiempos de compilación cortos (realmente no sé cómo manejar enlaces dinámicos a bibliotecas de 64 bits desde mi entorno de 32 bits), sin problemas cadenas de dependencia. El despliegue de nuevas versiones, por otro lado, puede ser feo, especialmente cuando se requieren nuevas bibliotecas (consulte la condición anterior de no tener derechos en las máquinas de destino, ni estas bibliotecas disponibles).

(3) He leído las preguntas relacionadas con este tema pero no he podido averiguar qué enfoque se ajusta mejor a mi situación.

Conclusiones:

  1. Gracias a todos por su ayuda!
  2. que probablemente vaya con la vinculación estática porque:
    • un despliegue más fácil
    • rendimiento predecible y más consistentes resultados durante perf. prueba (mira este documento: http://www.inf.usi.ch/faculty/hauswirth/publications/CU-CS-1042-08.pdf)
    • Como se señaló, el tamaño y la duración de la compilación de estática vs dinámico no parece ser una gran diferencia
    • Ciclos de prueba más fáciles y rápidos
    • Puedo mantener todos los dev. ciclo en mi dev. máquina

Respuesta

11

La vinculación estática tiene una mala reputación. Tenemos enormes discos duros en estos días, y tuberías extraordinariamente gordas. Muchos de los viejos argumentos a favor de la vinculación dinámica son mucho menos importantes ahora.

Además, hay una muy buena razón para preferir los enlaces estáticos en Linux: la gran cantidad de configuraciones de plataforma que existen hace que sea casi imposible garantizar que su ejecutable funcione incluso en una pequeña fracción sin enlaces estáticos.

Sospecho que esto no será una opinión popular. Multa. Pero tengo 11 años de experiencia implementando aplicaciones en Linux, y hasta que algo como LSB realmente despegue y realmente amplíe su alcance, Linux seguirá siendo mucho más difícil de implementar aplicaciones. Hasta entonces, enlace estáticamente su aplicación, si debe ejecutar en una amplia gama de plataformas.

+3

También lo hace más robusto después de la instalación. Si el usuario instala algo que cambia las bibliotecas dinámicas, su programa no se verá afectado. – Jay

+0

Un problema aún muy válido con la vinculación estática (y también con las bibliotecas incluidas) es que las actualizaciones de seguridad necesarias a menudo se descuidan. – wich

+0

No he visto mejoras notables en la velocidad con enlaces dinámicos en Linux. ir con estática: es más fácil y la memoria de su aplicación será más pequeña a menos que otro programa se ejecute al mismo tiempo con la misma dependencia (las bibliotecas dinámicas deben estar cargadas en su totalidad en la memoria, incluso si solo use 1 función). –

4

que probablemente utilizar la vinculación dinámica durante (la mayoría de) el desarrollo, y luego cambiar a la vinculación estática para las fases finales de desarrollo y de (todos) el despliegue. Afortunadamente, hay poca necesidad de pruebas adicionales cuando se pasa del enlace dinámico al enlace estático de las bibliotecas.

1

Lo mejor es dejar eso al empaquetador y proporcionar ambas opciones en los scripts configure/make. Por lo general, la vinculación dinámica tendría la preferencia ya que sería fácil actualizar las bibliotecas cuando sea necesario, es decir, cuando se descubran vulnerabilidades de seguridad, etc.

Tenga en cuenta que si no tiene privilegios de administrador para instalar las bibliotecas en los directorios del sistema, puede compilar el programa de modo que primero busque las bibliotecas dinámicas necesarias, esto se logra configurando la directiva runpath en los binarios ELF .Puede especificar dicho directorio con la opción -rpath del linker ld.

+0

O deje que la persona que ejecuta el programa indique que debe buscar en directorios adicionales utilizando la variable de entorno LD_LIBRARY_PATH. – jamessan

2

Este es otro voto para enlaces estáticos. No he notado tiempos de enlace significativamente más largos para nuestra aplicación. La aplicación en cuestión es una aplicación de consola de línea ~ 50K, con múltiples bibliotecas que se compila para un montón de máquinas fuera de lo común, en su mayoría supercomputadoras con 100-10,000 núcleos. Con la vinculación estática, usted sabe exactamente qué bibliotecas va a utilizar, puede probar fácilmente nuevas versiones de ellos.

En general, esta es la forma en que se construyen la mayoría de las aplicaciones de Mac. Es lo que permite que la instalación simplemente copie un directorio en el sistema.

Cuestiones relacionadas