¿Cuál es la diferencia entre bibliotecas estáticas y compartidas?
Uso Eclipse y hay varios tipos de proyectos, incluidas las bibliotecas estáticas y las bibliotecas compartidas. ¿Uno tiene una ventaja sobre el otro?
¿Cuál es la diferencia entre bibliotecas estáticas y compartidas?
Uso Eclipse y hay varios tipos de proyectos, incluidas las bibliotecas estáticas y las bibliotecas compartidas. ¿Uno tiene una ventaja sobre el otro?
Respuestas:
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 lo usan en tiempo de ejecución. Un programa que usa una biblioteca compartida solo hace referencia al código que usa 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 tiempo de 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 pequeños los binarios. También le permite reemplazar el objeto compartido con uno que sea funcionalmente equivalente, pero que pueda 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 general del binario, pero significa que no necesita llevar 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 asegurarme de que el binario no tenga muchas dependencias externas que puedan ser difíciles de cumplir, como versiones específicas de la biblioteca estándar C ++ o versiones específicas de la biblioteca Boost C ++.
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. Por lo tanto, 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 tuyo, y lo mantienes dentro de tu hogar / programa, y una vez que lo tienes no te importa dónde o cuándo lo obtuviste.
Simplificado:
Para una biblioteca estática, el enlazador extrae el código de la biblioteca y lo utiliza para construir el ejecutable final en el punto en que compila / construye su aplicación. El ejecutable final no tiene dependencias de la biblioteca en tiempo de ejecución
Para una biblioteca compartida, el compilador / enlazador verifica que los nombres con los que enlaza existen en la biblioteca cuando se crea la aplicación, pero no mueve su código a la aplicación. En tiempo de ejecución, la biblioteca compartida debe estar disponible.
El lenguaje de programación C en sí mismo no tiene un 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 cual mucha sangre (figurativa) ha sido derramada en el pasado.
Las bibliotecas estáticas se compilan como parte de una aplicación, mientras que las bibliotecas compartidas no. Cuando distribuye una aplicación que depende de bibliotecas compartidas, las bibliotecas, por ejemplo. los dll en MS Windows deben estar instalados.
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. La desventaja es que su aplicación es más grande porque la envía con todas las bibliotecas que necesita.
Además de conducir a aplicaciones más pequeñas, las bibliotecas compartidas ofrecen al usuario la posibilidad de usar su propia versión, tal vez mejor, de las bibliotecas en lugar de confiar en una que sea parte de la aplicación.
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 conducir a un desperdicio de memoria significativo.
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.
.so
archivos en los sistemas * nix son una biblioteca un poco compartida (dinámica).
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, compuesto por más de 300 proyectos (con Visual Studio), construido principalmente como lib estático y finalmente todos se unen en un gran ejecutable, terminas con los siguientes problemas:
-El tiempo de enlace es extremadamente largo. Puede terminar con más de 15 minutos de enlace, por ejemplo, 10 segundos 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ía 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 de incluir el encabezado, porque el enlace al final siempre encontrará símbolos. Termina con horribles dependencias de ciclismo y un completo desastre.
Con la biblioteca compartida, es un poco de trabajo extra 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.
-------------------------------------------------------------------------
| +- | 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 | |
-------------------------------------------------------------------------