stringtranslate.com

Biblioteca estática

En informática , una biblioteca estática o biblioteca enlazada estáticamente es un conjunto de rutinas, funciones externas y variables que se resuelven en un llamador en tiempo de compilación y se copian en una aplicación de destino por un compilador , enlazador o enlazador, produciendo un archivo de objeto y un ejecutable independiente . [1] Este ejecutable y el proceso de compilarlo 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 objeto durante la compilación/enlace para formar un solo ejecutable o se cargan en tiempo de ejecución en el espacio de direcciones de su ejecutable correspondiente en un desplazamiento de memoria estática determinado en tiempo de compilación/enlace.

Ventajas y desventajas

Existen varias ventajas en vincular estáticamente las bibliotecas con un ejecutable en lugar de hacerlo dinámicamente . La ventaja más significativa es que la aplicación puede estar segura de que todas sus bibliotecas están presentes y de que son de la versión correcta. Esto evita los problemas de dependencia, conocidos coloquialmente como DLL Hell o, de forma más general, el infierno de las dependencias . La vinculación estática también puede permitir que la aplicación esté contenida en un único archivo ejecutable, lo que simplifica la distribución y la instalación.

Con la vinculación estática, basta con incluir aquellas partes de la biblioteca a las que hace referencia directa e indirectamente el ejecutable de destino (o la biblioteca de destino). Con las bibliotecas dinámicas, se carga toda la biblioteca, ya que no se sabe de antemano qué funciones invocarán 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 es 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 habitual incluir los archivos de biblioteca que necesita una aplicación junto con la aplicación. [2] En sistemas tipo Unix esto es menos común, ya que se pueden utilizar sistemas de gestión de paquetes para garantizar que estén disponibles los archivos de biblioteca correctos. Esto permite que los archivos de biblioteca se compartan entre muchas aplicaciones, lo que genera ahorros de espacio. También permite que la biblioteca se actualice para corregir errores y fallas de seguridad sin actualizar las aplicaciones que utilizan la biblioteca. En la práctica, muchos ejecutables (especialmente los 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 enlazador y el cargador manejan esto de la misma manera que para otros tipos de archivos de objetos . Los archivos de biblioteca estática pueden ser enlazados en tiempo de ejecución por un cargador de enlace (por ejemplo, el cargador de módulos X11 ). Sin embargo, si dicho proceso puede ser llamado enlace estático es controvertido.

Creación de 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 una biblioteca de este tipo, las funciones/procedimientos exportados y otras variables de objetos deben especificarse para enlaces externos (es decir, no utilizando la staticpalabra clave C ). Los nombres de archivo de bibliotecas estáticas suelen tener la extensión " .a " en sistemas tipo Unix [1] y la extensión " .lib " en Microsoft Windows .

Por ejemplo, en un sistema tipo Unix, para crear un archivo llamado libclass.a a partir de los archivos class1.o , class2.o , class3.o , se utilizaría el siguiente comando: [1]

ar rcs libclass.a clase1.o clase2.o clase3.o

Para compilar un programa que depende de class1.o , class2.o y class3.o , se podría hacer:

cc principal.c libclass.a

o (si libclass.a se ubica 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 lugar de:

cc main.c clase1.o clase2.o clase3.o

Véase también

Referencias

  1. ^ abc "Bibliotecas estáticas". TLDP . Consultado el 3 de octubre de 2013 .
  2. ^ Anderson, Rick (11 de enero de 2000). "El fin del infierno de las 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 que solo utiliza esa aplicación.