Una biblioteca estática o biblioteca enlazada estáticamente contiene funciones y datos que pueden incluirse en un programa informático que la utilice en tiempo de compilación, de modo que la biblioteca no necesita ser accesible en un archivo separado en tiempo de ejecución. [ 1 ] Si todas las bibliotecas están enlazadas estáticamente, el ejecutable resultante será independiente , también conocido como compilación estática .
Una biblioteca estática se fusiona con otras bibliotecas estáticas y archivos objeto en tiempo de compilación para formar un único ejecutable , o bien se carga 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.
Comparación con el enlace dinámico
Históricamente, todos los enlaces entre bibliotecas eran estáticos, pero hoy en día el enlace dinámico es una alternativa que conlleva ciertas desventajas.
Una ventaja del enlace estático sobre el dinámico es que la aplicación tiene garantizado el acceso a las rutinas de la biblioteca que necesita en tiempo de ejecución, ya que el código de dichas rutinas está integrado en el archivo ejecutable. Con el enlace dinámico, no solo puede faltar el archivo de la biblioteca, sino que, incluso si se encuentra, podría ser una versión incompatible. El enlace estático evita el problema de las dependencias complejas (o, en general, el infierno de las DLL) y, por lo tanto, simplifica el desarrollo, la distribución y la instalación.
Con el enlace estático, un enlazador inteligente solo incluye el código que se utiliza realmente, pero en el caso de una biblioteca dinámica, se carga la biblioteca completa en el espacio de direcciones, lo que significa que el código que no utiliza el programa puede cargarse en memoria. Sin embargo, si más de un programa utiliza ese código, solo se carga en memoria una copia del código compartido.
El tamaño de un ejecutable es mayor con el enlace estático que con el dinámico, ya que el ejecutable enlazado estáticamente incluye copias de las rutinas de la biblioteca que utiliza el programa. Sin embargo, si el tamaño de una aplicación se mide como la suma del ejecutable y sus bibliotecas dinámicas, el tamaño total suele ser menor con el enlace estático. Pero si varias aplicaciones utilizan la misma biblioteca dinámica, el tamaño total de las aplicaciones combinadas y las bibliotecas dinámicas podría ser menor con el enlace dinámico.
En Windows, es común instalar las bibliotecas dinámicas de un programa junto con el archivo del programa. [ 2 ] En sistemas tipo Unix, esto es menos frecuente, ya que se pueden usar sistemas de gestión de paquetes para asegurar que los archivos de biblioteca correctos estén disponibles en una ubicación compartida. Los archivos de biblioteca se pueden compartir entre aplicaciones, lo que ahorra espacio. La biblioteca se puede actualizar para corregir errores y fallos de seguridad sin necesidad de actualizar cada aplicación que la utiliza. Sin embargo, las bibliotecas dinámicas compartidas conllevan el riesgo de problemas de dependencia.
En la práctica, muchos programas ejecutables utilizan tanto bibliotecas estáticas como dinámicas.
Enlace y carga
Cualquier función de una biblioteca estática puede llamar a una función o procedimiento de otra biblioteca estática. El enlazador y el cargador gestionan esto del mismo modo que con otros tipos de archivos objeto . Los archivos de bibliotecas estáticas pueden enlazarse en tiempo de ejecución mediante un cargador de enlace (por ejemplo, el cargador de módulos X11 ). Sin embargo, existe controversia sobre si este proceso puede denominarse enlace estático .
Creación de bibliotecas estáticas en C/C++
Las bibliotecas estáticas se pueden crear fácilmente en C o en C++ . Estos lenguajes proporcionan especificadores de clase de almacenamiento para indicar el enlace externo o interno, además de otras características. Para crear una biblioteca de este tipo, las funciones o procedimientos exportados y otros objetos y variables deben especificarse para el enlace externo (es decir, sin usar la staticpalabra clave de C ). Los nombres de archivo de las 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 class1.o class2.o class3.o
Para compilar un programa que depende de class1.o , class2.o y class3.o , se podría hacer lo siguiente:
cc main.c libclass.a
o (si libclass.a se encuentra 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 2 3 "Bibliotecas estáticas" . TLDP . Consultado el 3 de octubre de 2013 .
- ↑ Anderson, Rick (11 de enero de 2000). "El fin del infierno de las DLL" . microsoft.com. Archivado del 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.
- Bibliotecas informáticas