wake-up-neo.net

¿Diferencia entre bibliotecas estáticas y compartidas?

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

¿Utilizo Eclipse y hay varios tipos de proyectos que incluyen bibliotecas estáticas y bibliotecas compartidas? ¿Uno tiene una ventaja sobre el otro?

509
Mohit Deshpande

Las bibliotecas compartidas son archivos .so (o en Windows .dll, o en OS X .dylib). Todo el código relacionado con la biblioteca se encuentra en este archivo, y los programas que lo utilizan lo mencionan en tiempo de ejecución. Un programa que utiliza una biblioteca compartida solo 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 usa una biblioteca estática toma copias del código que usa de la biblioteca estática y lo hace parte del programa. [Windows también tiene archivos .lib que se usan 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 es funcionalmente equivalente, pero puede haber agregado beneficios de rendimiento sin necesidad de volver a compilar el programa que lo utiliza. Sin embargo, las bibliotecas compartidas tendrán un pequeño costo adicional para 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 usan. 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 esto significa que no es necesario llevar una copia de la biblioteca que se está utilizando. Como el código está conectado en tiempo de compilación, no hay costos adicionales de carga en tiempo de ejecución. El código simplemente está ahí.

Personalmente, prefiero 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 de Boost C++.

694
Petesh

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 llevar a casa; con este último, usted y todos los demás van a la biblioteca para usar el mismo libro/función. Así que cualquier persona 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 en su hogar/programa, y ​​una vez que lo tiene, no le importa dónde ni cuándo lo obtuvo.

362
Paul Richter

Simplificado:

  • Enlace estático: un ejecutable grande
  • Enlace dinámico: un pequeño archivo ejecutable más uno o más archivos de biblioteca (archivos .dll en Windows, .so en Linux o .dylib en macOS)
62
StackedCrooked

Para una biblioteca estática, el código es extraído de la biblioteca por el enlazador y se usa para compilar el ejecutable final en el punto en que compila/construye su aplicación. El ejecutable final no tiene dependencias en la biblioteca en tiempo de ejecución

Para una biblioteca compartida, el compilador/vinculador comprueba que los nombres con los que se vincula existen en la biblioteca cuando se crea la aplicación, pero no mueve su código a la aplicación. En el tiempo de ejecución, la biblioteca compartida debe estar disponible.

El lenguaje de programación C en sí mismo no tiene ningún concepto de bibliotecas estáticas o compartidas; son completamente una función de implementación.

Personalmente, prefiero usar bibliotecas estáticas, ya que simplifica la distribución de software. Sin embargo, esta es una opinión sobre la cual se ha derramado mucha sangre (figurativa) en el pasado.

31
anon

Las bibliotecas estáticas se compilan como parte de una aplicación, mientras que las bibliotecas compartidas no lo son. Cuando distribuye una aplicación que depende de bibliotecas compartidas, las bibliotecas, por ejemplo. DLL en MS Windows necesita ser instalado.

La ventaja de las bibliotecas estáticas es que no se requieren dependencias para el usuario que ejecuta la aplicación, por ejemplo, no tienen que actualizar su DLL de lo que sea. La desventaja es que su aplicación es de mayor tamaño porque la está enviando con todas las bibliotecas que necesita.

Además de llevar a aplicaciones más pequeñas, las bibliotecas compartidas ofrecen al usuario la posibilidad de utilizar su propia versión, quizás mejor, de las bibliotecas en lugar de confiar en una que forma parte de la aplicación.

28
Tarski

La ventaja más importante de las bibliotecas compartidas es que solo hay una copia del código cargado en la memoria, sin importar cuántos procesos estén usando la biblioteca. Para las bibliotecas estáticas, cada proceso obtiene su propia copia del código. Esto puede llevar a un desperdicio significativo de memoria.

OTOH, una ventaja de las bibliotecas estáticas es que todo está incluido en su aplicación. Por lo tanto, no debe preocuparse de que el cliente tenga la biblioteca (y la versión) correctas disponibles en su sistema.

17
Jasmeet

Además de todas las otras respuestas, una cosa que no se menciona aún es el desacoplamiento:

Permítanme hablar sobre un código de producción del mundo real, con el que he estado tratando:

Un software muy grande, hecho de más de 300 proyectos (con Visual Studio), en su mayoría compilado como biblioteca estática y, finalmente, todos se vinculan en un enorme archivo ejecutable, terminan con los siguientes problemas:

-El tiempo de enlace es extremadamente largo. Podría terminar con más de 15 minutos de enlace, por ejemplo, 10s de tiempo de compilación: algunas herramientas están de rodillas con un ejecutable tan grande, como las herramientas de verificación de memoria que deben instrumentar el código. Podrías caer dentro de límites que habían sido vistos como tontos.

Más problemático es el desacoplamiento de su software: en este ejemplo del mundo real, los archivos de encabezados de cada proyecto eran accesibles desde cualquier otro proyecto. Como consecuencia, fue extremadamente fácil para un desarrollador agregar dependencias; fue casi sobre la inclusión del encabezado, porque el enlace al final siempre buscará símbolos. Termina por horribles dependencias de ciclismo y desorden completo.

Con la biblioteca compartida, es un poco de trabajo adicional porque el desarrollador debe editar el sistema de compilación del proyecto para agregar la biblioteca dependiente. Observé que el código de biblioteca compartida tiende a ofrecer un código API más limpio.

6
sandwood
-------------------------------------------------------------------------
|  +-  |    Shared(dynamic)       |   Static Library (Linkages)         |
-------------------------------------------------------------------------
|Pros: | less memory use          |   an executable, using own libraries|
|      |                          |     ,coming with the program,       |
|      |                          |   doesn't need to worry about its   |
|      |                          |   compilebility subject to libraries|
-------------------------------------------------------------------------
|Cons: | implementations of       |   bigger memory uses                |
|      | libraries may be altered |                                     |
|      | subject to OS  and its   |                                     |
|      | version, which may affect|                                     |
|      | the compilebility and    |                                     |
|      | runnability of the code  |                                     |
-------------------------------------------------------------------------
0
snr