¿Diferencia entre bibliotecas estáticas y compartidas?


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

Uso Eclipse y hay varios tipos de proyectos, incluyendo Bibliotecas Estáticas y Bibliotecas compartidas? ¿Tiene una ventaja sobre la otra?

Author: Mohit Deshpande, 2010-04-16

7 answers

Las bibliotecas compartidas son .so (o en Windows .dll, o en OS X .dylib) files. Todo el código relacionado con la biblioteca está en este archivo, y es referenciado por los programas que lo usan 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.a (o en Windows .lib) archivos. Todo el código relacionado con la biblioteca está en este archivo, y está directamente vinculado al programa en tiempo de compilación. Un programa usando una estática library 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 utilizan para hacer referencia .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 con uno que es funcionalmente equivalente, pero puede tener beneficios de rendimiento adicionales sin necesidad de recompilar el programa que hace uso de ella. 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 conectarse 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 el complemento binario sistema.

Las bibliotecas estáticas aumentan el tamaño total del binario, pero esto 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 adicionales de carga en tiempo de ejecución. El código simplemente está ahí.

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

 648
Author: Petesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-22 17:03:44

Una biblioteca estática es como una librería y una biblioteca compartida es como... biblioteca. Con el primero, usted obtiene su propia copia del libro/función para llevar a casa; con el segundo, usted y todos los demás van a la biblioteca para usar el mismo libro/función. Así que cualquiera que quiera usar la biblioteca (compartida) necesita saber dónde está, porque tienes que "ir a buscar" el libro/función. Con una biblioteca estática, el libro / función es suyo para poseer, y lo mantiene dentro de su casa/programa, y una vez que lo tiene no me importa dónde o cuándo lo conseguiste.

 341
Author: Paul Richter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-26 04:36:57

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)
 53
Author: StackedCrooked,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-31 16:23:32

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

Las ventajas 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... Las desventajas es que su aplicación es más grande en tamaño porque usted está enviando con todas las bibliotecas que necesita.

Además de dar lugar a aplicaciones más pequeñas, las bibliotecas compartidas ofrecen al usuario la posibilidad de usar su propia versión, quizás mejor, de las bibliotecas en lugar de depender de una que sea parte de la aplicación

 28
Author: Tarski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-15 22:17:27

Para una biblioteca estática, el código se extrae de la biblioteca por el enlazador y se utiliza para construir 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/enlazador comprueba que los nombres con los que se enlaza existan en la biblioteca cuando se compila la aplicación, pero no mueve su código a la aplicación. En tiempo de ejecución, la biblioteca compartida debe ser disponible.

El lenguaje de programación C en sí no tiene concepto de bibliotecas estáticas o compartidas - son completamente una característica 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 que se ha derramado mucha sangre (figurativa) en el pasado.

 26
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-15 22:13:00

La ventaja más significativa de las bibliotecas compartidas es que solo hay una copia de código cargada 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 tiene que preocuparse de que el cliente tenga la biblioteca correcta (y la versión) disponible en su sistema.

 16
Author: Jasmeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-16 08:08:36

Además de todas las otras respuestas, una cosa que aún no se ha mencionado 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 >300 proyectos (con visual studio), en su mayoría se construyen como lib estática y finalmente todos se enlazan en un enorme ejecutable, termina con los siguientes problemas:

-El tiempo de enlace es extremadamente largo. Usted puede terminar por más de 15 minutos de enlace, por digamos 10s de compilación tiempo - Algunas herramientas están en su rodilla con un ejecutable tan grande, como las herramientas de verificación de memoria que deben instrumentar el código. Podrías caer en alcanzar 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; se trataba solo de incluir el encabezado, porque el enlace al final allwaws encontrar símbolos. Termina por horribles dependencias de ciclismo y un completo desastre.

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 una API de código más limpia.

 3
Author: sandwood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-30 14:36:46