Pregunta

Voy a empezar un nuevo proyecto de C ++ que se basará en una serie de bibliotecas, incluyendo parte de las bibliotecas Boost, la log4cxx o la biblioteca de registro Google - ya medida que el proyecto evoluciona otros también (que no puedo todavía anticipar).

Se tendrá que funcionar tanto con sistemas de 32 y 64 bits, lo más probablemente en un entorno Linux muy diversa en la que no esperar a tener todas las bibliotecas necesarias disponibles ni privilegios SU.

Mi pregunta es, ¿debería construir mi aplicación dinámica o estática que une a todas estas bibliotecas?

Notas:

(1) Soy consciente de la vinculación estática podría ser un dolor durante el desarrollo (largos 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 las pruebas -. basta con mover el archivo y ejecute

(2) Por otra parte, la vinculación de las costuras dinámicas más fácilmente durante la fase de desarrollo - cortos tiempos de compilación, (en realidad no saben cómo manejar dinámico que une a las bibliotecas de 64 bits de mi entorno de desarrollo de 32 bits), no hay prisa con la dependencia cadenas. Despliegue de nuevas versiones por otro lado puede ser feo -. Especialmente cuando se requieren nuevas bibliotecas (véase la anterior condición de no tener derechos de SU en las máquinas específicas, ni estas bibliotecas disponible)

(3) He leído las preguntas relacionadas con respecto a este tema, pero realmente no podía entender por qué enfoque mejor se ajusta a mi escenario.

Conclusiones:

  1. Gracias a todos por su ayuda!
  2. probablemente irá con la vinculación estática, ya que:
    • Despliegue más sencillo
    • Rendimiento previsible y resultados más consistentes durante perf. prueba (vistazo a 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 dinámica vs estática no parece haber una gran diferencia
    • Es más fácil y más rápido ciclos de prueba
    • puedo guardar todo el prog. ciclo en mi prog. máquina
¿Fue útil?

Solución

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

Además, hay una muy buena razón para preferir la vinculación estática en Linux:. La gran cantidad de configuraciones de plataforma por ahí hacen que sea casi imposible garantizar su trabajo será ejecutable a través de incluso una pequeña fracción de ellos sin vinculación estática

sospecho que esto no va a ser una opinión popular. Multa. Pero tengo 11 años de experiencia en la implementación de aplicaciones en Linux, y hasta algo así como LSB realmente despega y realmente lo extiende de alcance, Linux seguirá siendo mucho más difícil de implementar aplicaciones en. Hasta entonces, vincular estáticamente su aplicación, si tiene que correr a través de una amplia gama de plataformas.

Otros consejos

Me 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 (todos) el despliegue. Afortunadamente, hay poca necesidad de pruebas adicionales cuando se cambia de vinculación dinámica a estática de las bibliotecas.

Este es otro voto para la vinculación estática. No he notado significativamente mayor tiempo de vinculación para salir de la aplicación. La aplicación en cuestión es una aplicación de consola de línea de ~ 50K, con varias bibliotecas que se compila para un montón de fuera de las máquinas ordinarias, en su mayoría superordenadores con 100-10.000 núcleos. Con la vinculación estática, usted sabe exactamente lo que las bibliotecas que se va a utilizar, se puede probar fácilmente nuevas versiones de ellos.

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

Mejor es dejar que hasta el empaquetador y proporcionar las dos opciones en las secuencias de comandos configure / make. Por lo general, la vinculación dinámica tendría la preferencia ya que entonces sería fácil de actualizar las bibliotecas cuando sea necesario, es decir, cuando las vulnerabilidades de seguridad, etc., están por descubrir.

Tenga en cuenta que si usted no tiene privilegios de administrador para instalar las bibliotecas en los directorios del sistema se puede compilar el programa de tal manera que primero se verá en otros lugares de las bibliotecas dinámicas necesarias, esto se logra mediante el establecimiento de la directiva RUNPATH en binarios ELF. Se puede especificar un directorio con la opción -rpath del enlazador ld.

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