¿Diferencia entre bibliotecas estáticas y compartidas?

Resuelto Mohit Deshpande asked hace 14 años • 9 respuestas

¿Cuál es la diferencia entre bibliotecas estáticas y compartidas?

Utilizo Eclipse y hay varios tipos de proyectos, incluidas bibliotecas estáticas y bibliotecas compartidas. ¿Tiene uno ventaja sobre el otro?

Mohit Deshpande avatar Apr 16 '10 05:04 Mohit Deshpande
Aceptado

Las bibliotecas compartidas son archivos .so (o en Windows .dll o en OS X .dylib). Todo el código relacionado con la biblioteca está en este archivo y los programas que lo utilizan en tiempo de ejecución hacen referencia a él. Un programa que utiliza una biblioteca compartida sólo hace referencia al código que utiliza en la biblioteca compartida.

Las bibliotecas estáticas son archivos .a (o en Windows .lib). Todo el código relacionado con la biblioteca está en este archivo y está directamente vinculado al programa en el momento de la compilación. Un programa que utiliza una biblioteca estática toma copias del código que utiliza de la biblioteca estática y lo convierte en parte del programa. [Windows también tiene archivos .lib que se utilizan para hacer referencia a archivos .dll, pero actúan de la misma manera que el primero].

Hay ventajas y desventajas en cada método:

  • Las bibliotecas compartidas reducen la cantidad de código que se duplica en cada programa que hace uso de la biblioteca, manteniendo los binarios pequeños. También le permite reemplazar el objeto compartido por uno que sea funcionalmente equivalente, pero que pueda tener beneficios de rendimiento adicionales sin necesidad de volver a compilar el programa que lo utiliza. Sin embargo, las bibliotecas compartidas tendrán un pequeño costo adicional por la ejecución de las funciones, así como un costo de carga en tiempo de ejecución, ya que todos los símbolos de la biblioteca deben estar conectados a las cosas que utilizan. Además, las bibliotecas compartidas se pueden cargar en una aplicación en tiempo de ejecución, que es el mecanismo general para implementar sistemas de complementos binarios.

  • Las bibliotecas estáticas aumentan el tamaño total del binario, pero eso significa que no es necesario llevar consigo una copia de la biblioteca que se está utilizando. Como el código está conectado en tiempo de compilación, no hay costos de carga adicionales en tiempo de ejecución. El código simplemente está ahí.

Personalmente, prefiero las bibliotecas compartidas, pero uso bibliotecas estáticas cuando necesito asegurar que el binario no tenga muchas dependencias externas que puedan ser difíciles de cumplir, como versiones específicas de la biblioteca estándar de C++ o versiones específicas de la biblioteca Boost C++.

Anya Shenanigans avatar Apr 15 '2010 22:04 Anya Shenanigans

Una biblioteca estática es como una librería y una biblioteca compartida es como... una biblioteca. Con el primero, obtienes tu propia copia del libro/función para llevarte a casa; con este último, usted y todos los demás van a la biblioteca para utilizar el mismo libro/función. Entonces, cualquiera que quiera usar la biblioteca (compartida) necesita saber dónde está, porque tiene que "ir a buscar" el libro/función. Con una biblioteca estática, el libro/función es suyo y lo guarda dentro de su hogar/programa, y ​​una vez que lo tiene no le importa dónde ni cuándo lo obtuvo.

Paul Richter avatar Apr 16 '2010 01:04 Paul Richter

Simplificado:

  • Enlace estático: un ejecutable grande
  • Enlace dinámico: un pequeño ejecutable más uno o más archivos de biblioteca (archivos .dll en Windows, .so en Linux o .dylib en macOS)
StackedCrooked avatar Apr 15 '2010 22:04 StackedCrooked