c++ - librerías - diferencia entre biblioteca y libreria en programacion
¿Diferencia entre bibliotecas estáticas y compartidas? (7)
¿Cuál es la diferencia entre bibliotecas estáticas y compartidas?
Utilizo Eclipse y hay varios tipos de proyectos, incluyendo bibliotecas estáticas y bibliotecas compartidas. ¿Uno tiene una ventaja sobre el otro?
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 son 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.
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 tiene que preocuparse de que el cliente tenga la biblioteca (y la versión) correctas disponibles en su sistema.
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 general 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 ++.
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.
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 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.
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 momento 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 existe 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 el 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.
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)
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 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.