En ciencias de la computación , una biblioteca estática o biblioteca vinculada estáticamente es un conjunto de rutinas, funciones externas y variables que se resuelven en un llamador en tiempo de compilación y un compilador , enlazador o enlazador copia en una aplicación de destino , produciendo un objeto. archivo y un ejecutable independiente . [1] Este ejecutable y el proceso de compilación se conocen como una compilación estática del programa. Históricamente, las bibliotecas solo podían ser estáticas . Las bibliotecas estáticas se fusionan con otras bibliotecas estáticas y archivos de objetosdurante la construcción / vinculación para formar un solo ejecutable o cargarse en tiempo de ejecución en el espacio de direcciones de su ejecutable correspondiente en un desplazamiento de memoria estático determinado en tiempo de compilación / tiempo de enlace.
Ventajas y desventajas
Hay varias ventajas de vincular estáticamente bibliotecas con un ejecutable en lugar de vincularlas dinámicamente . La ventaja más significativa es que la aplicación puede tener la certeza de que todas sus bibliotecas están presentes y de que son la versión correcta. Esto evita problemas de dependencia, conocidos coloquialmente como DLL Hell o, más generalmente, infierno de dependencia . La vinculación estática también puede permitir que la aplicación esté contenida en un solo archivo ejecutable, simplificando la distribución y la instalación.
Con la vinculación estática, es suficiente incluir aquellas partes de la biblioteca a las que el ejecutable de destino (o biblioteca de destino) hace referencia directa e indirectamente. Con las bibliotecas dinámicas, se carga toda la biblioteca, ya que no se sabe de antemano qué funciones serán invocadas por las aplicaciones. Que esta ventaja sea significativa en la práctica depende de la estructura de la biblioteca.
En el enlace estático, el tamaño del ejecutable se vuelve mayor que en el enlace dinámico, ya que el código de la biblioteca se almacena dentro del ejecutable en lugar de en archivos separados. Pero si los archivos de la biblioteca se cuentan como parte de la aplicación, el tamaño total será similar o incluso menor si el compilador elimina los símbolos no utilizados.
Específico del entorno
En Microsoft Windows , es común incluir los archivos de la biblioteca que una aplicación necesita con la aplicación. [2] En sistemas similares a Unix, esto es menos común ya que los sistemas de administración de paquetes se pueden usar para garantizar que los archivos de biblioteca correctos estén disponibles. Esto permite que los archivos de la biblioteca se compartan entre muchas aplicaciones, lo que permite ahorrar espacio. También permite que la biblioteca se actualice para corregir errores y fallas de seguridad sin actualizar las aplicaciones que usan la biblioteca. En la práctica, muchos ejecutables (especialmente aquellos destinados a Microsoft Windows) utilizan bibliotecas tanto estáticas como dinámicas.
Vinculación y carga
Cualquier función de biblioteca estática puede llamar a una función o procedimiento en otra biblioteca estática. El vinculador y el cargador manejan esto de la misma manera que para otros tipos de archivos de objeto . Los archivos de la biblioteca estática se pueden vincular en tiempo de ejecución mediante un cargador de vinculación (por ejemplo, el cargador del módulo X11 ). Sin embargo, es controvertido si un proceso de este tipo puede llamarse enlace estático .
Creando bibliotecas estáticas en C / C ++
Las bibliotecas estáticas se pueden crear fácilmente en C o en C ++ . Estos dos lenguajes proporcionan especificadores de clase de almacenamiento para indicar enlaces externos o internos, además de proporcionar otras características. Para crear dicha biblioteca, las funciones / procedimientos exportados y otras variables de objetos deben especificarse para el enlace externo (es decir, sin usar la static
palabra clave C ). Los nombres de archivos de bibliotecas estáticas suelen tener la extensión " .a " en sistemas similares a Unix [1] y la extensión " .lib " en Microsoft Windows .
Por ejemplo, para crear un archivo llamado libclass.a a partir de los archivos class1.o , class2.o , class3.o , se usaría el siguiente comando: [1]
ar rcs libclass.a class1.o class2.o class3.o
para compilar un programa que depende de class1.o , class2.o y class3.o, se podría hacer:
cc main.c libclass.a
o (si libclass.a se coloca en la ruta de la biblioteca estándar, como / usr / local / lib )
cc main.c -lclass
o (durante la vinculación)
ld ... main.o -lclass ...
en vez de:
cc main.c class1.o class2.o class3.o
Ver también
Referencias
- ^ a b c "Bibliotecas estáticas" . TLDP . Consultado el 3 de octubre de 2013 . CS1 maint: parámetro desalentado ( enlace )
- ^ Anderson, Rick (11 de enero de 2000). "El fin del infierno DLL" . microsoft.com. Archivado desde el original el 5 de junio de 2001 . Consultado el 31 de agosto de 2013 .
Las DLL privadas son DLL que se instalan con una aplicación específica y solo las usa esa aplicación.
CS1 maint: parámetro desalentado ( enlace )