Cómo utilizar la biblioteca estática y la biblioteca compartida en la plataforma Linux

  

1, introducción a la biblioteca de funciones de Linux

La biblioteca de funciones se puede considerar como un conjunto de funciones escritas de antemano, que se pueden separar de la función principal, aumentando así el programa. Reutilización del desarrollo. Las bibliotecas de funciones en Linux se pueden usar en tres formas: estática, compartida y dinámica.

1) El código de la biblioteca estática se conecta a la aplicación desarrollada por el desarrollador en el momento de la compilación;

2) y la biblioteca compartida solo se carga cuando el programa comienza a ejecutarse;

3) La biblioteca dinámica también se carga cuando el programa se está ejecutando, pero a diferencia de la biblioteca compartida, la función de biblioteca utilizada por la biblioteca dinámica no se carga en el programa, pero la declaración en el programa necesita usar la función. Sólo cargado. Las bibliotecas dinámicas pueden liberar la memoria utilizada por las bibliotecas dinámicas durante la ejecución del programa, liberando espacio para que otros programas lo utilicen.

Nota:

l Dado que las bibliotecas compartidas y las bibliotecas dinámicas no incluyen el contenido de las funciones de la biblioteca en el programa, solo contienen referencias a las funciones de la biblioteca, por lo que el tamaño del código es relativamente pequeño.

l La mayoría de las bibliotecas disponibles en el sistema se almacenan en /usr /local /lib, /usr /lib, /lib y directorios.

l La mayoría de los archivos de encabezado se encuentran en el directorio /usr /include, /usr /local /include.

l Los archivos de configuración y los comandos de administración de la biblioteca compartida son los siguientes:

/etc/ld.so.conf: la ubicación de búsqueda de la biblioteca compartida.

ldconfig: Herramienta de administración de biblioteca compartida, generalmente ejecuta este comando después de actualizar la biblioteca compartida.

ldd: puede ver las bibliotecas compartidas utilizadas por el ejecutable.

l El nombre del archivo de la biblioteca consta del prefijo lib y el nombre y el sufijo de la biblioteca. Según el tipo de biblioteca, el nombre del sufijo es diferente.


2, la razón principal para el uso extensivo de archivos de biblioteca

1) Para la conveniencia de la programación, para algunas funciones de uso común, el lenguaje de desarrollo correspondiente proporciona una biblioteca correspondiente Soporte de archivos.

2) Ocultar detalles específicos de la implementación de la función. Cuando un programador utiliza un archivo de biblioteca, solo necesita incluir el archivo de encabezado de la función requerida, sin tener que preocuparse por la implementación específica de la función. Para software comercial, su propiedad intelectual también está protegida.


3. ¿Cuáles son las formas de usar estas funciones de biblioteca?

En cualquier entorno de programación, los archivos de biblioteca son colecciones de funciones precompiladas. Estas funciones están en binario. El formulario de código se almacena en un archivo de biblioteca. Para usar estas funciones, los usuarios solo necesitan incluir estos archivos de biblioteca. En general, hay dos formas de obtener la función correspondiente del archivo de biblioteca.

1) En el momento de la compilación, el código de imagen binario de la función correspondiente en la biblioteca se copia directamente al programa compilado actualmente, y el programa actual se ejecuta de forma independiente. Esta biblioteca se llama biblioteca estática. En Linux, el sufijo .a es una biblioteca estática.

2) En el momento de la compilación, solo se hace referencia a la dirección de entrada del código de imagen binario de la función correspondiente en la biblioteca (no se copia directamente). El programa lee el código de función del archivo de biblioteca compartida en tiempo de ejecución (esto debe ser el primero La biblioteca compartida se carga en la memoria), que hace referencia indirectamente. Esta biblioteca se denomina biblioteca compartida. En Linux, se denomina en el formato libxxx.xo.xx.


4, cómo usar

Los tres tipos de métodos que usan la biblioteca estática, la biblioteca compartida y la biblioteca dinámica son muy similares, todos utilizan la opción es " -l " (Tenga en cuenta que se trata de "L ") en minúsculas. Esta opción se usa para indicar el archivo de biblioteca específico a usar. Dado que las reglas de nomenclatura de la biblioteca de funciones en Linux comienzan con "ld"; lib ", el archivo de biblioteca aquí solo necesita completar el contenido después de lib. Por ejemplo: hay un archivo de biblioteca estática libm.a, simplemente escriba "&lm"; - lm "; también para el archivo de biblioteca dinámica libm.so; al escribir, solo necesita escribir " -lm ", el comando de llamada completo Similar a lo siguiente:

[root @ localhost gcc] # gcc -o dynamic – L /root /lq /testc /lib /dynamic.o -lmydynamic

Por lo tanto, si ambos sistemas existen Cuando se utilizan un archivo de biblioteca estática y un archivo de biblioteca dinámica con el mismo nombre de archivo, ¿la opción de enlace llama un archivo de biblioteca estática o un archivo de biblioteca dinámica? Después de la prueba, puede encontrar que el sistema llama al archivo de biblioteca dinámica, lo cual se debe a que el sistema predeterminado en Linux es usar enlaces dinámicos. De esta manera, si el usuario desea llamar a un archivo de biblioteca estática que contiene un archivo de biblioteca dinámica con el mismo nombre, es necesario mostrar el nombre del archivo que contiene el nombre del sufijo después de " -l " por ejemplo, para escribir el archivo de biblioteca libm.a, debe escribir y " -llibm.a y ".


1) Si ya tiene un archivo de biblioteca estático libhello.a, el archivo de encabezado de este archivo de biblioteca es libhello.h, que tiene el siguiente contenido:

#ifndef __libhello_H__

#define __libhello_H__

void print_hello (void); //imprime hola mundo, esta es la biblioteca a la consola

#endif /* __ libhello_H __ * /

Podemos ver en el código anterior que el archivo de encabezado sabe que el archivo de biblioteca libhello.a contiene la función print_hello () y que su tipo de valor y parámetros de retorno están vacíos. Por lo tanto, al escribir un programa, solo necesita usar esta función (con el archivo de encabezado incluido), independientemente de los detalles de su implementación.

El programa de ejemplo main.c que usa el archivo de biblioteca libhello.a es el siguiente:

#include " libhello.h "

int main (int argc, char ** argv )

{

print_hello (); //Función de biblioteca de referencia

return 0;

}

Ahora podemos poner main .c, libhello.a copia en el mismo directorio, compile:

#gcc – usehello_static usehello.c – lhello //También puede usar libhello.a directamente, sin agregar una barra horizontal

2) Si ya tiene un archivo de biblioteca compartida libhello.so.0.0, tenemos que hacer dos enlaces simbólicos aquí (el motivo específico no lo tengo muy claro):

# ln – s libhello.so.0 libhello.so.0.0

# ln – s libhello.so libhello.so.0

Podemos copiar estos tres archivos al directorio actual, esta biblioteca La función print_hello () se define en el archivo libhello.so.0.0. Puede ver su archivo de encabezado libhello.h, que contiene el siguiente contenido:

#ifndef __libhello_H__

#define __libhello_H__

void print_hello (void); //es decir, print_hello ( La función ha estado activa

#endif /* __ libhello_H __ * /

Del mismo modo, también podemos hacer referencia a la función en el archivo de biblioteca compartida en main.c, el contenido de main.c es el siguiente:

#include " libhello.h "

int main (int argc, char ** argv)

{

print_hello (); //Función de biblioteca de referencia

return 0;

}

Luego compile la conexión con el siguiente comando (puede copiar el archivo de biblioteca libhello.so.0.0 al directorio o sistema actual /lib En el directorio):

#gcc – Wall – g – c usehello.c – o usehello.o //usehello.o es un archivo de objeto binario

# gcc – g – o usehello_dynamic usehello.o – L ./-lhello //La etiqueta roja es un comando específicamente para hacer referencia a bibliotecas compartidas " -L dir "

Después de generar el archivo ejecutable, puede usar ldd La biblioteca compartida utilizada por el ejecutable de comandos:

# ldd usehello_dynamic

El terminal indicará: libhello.so.0 = > no encontrado, por lo tanto, si desea que este ejecutable se ejecute como se espera, debe Ejecuta la biblioteca compartida a la ruta de búsqueda de la biblioteca:

# LD_LIBRARY_PATH = $ (pwd) ./usehello_dynamic

Copyright © Conocimiento de Windows All Rights Reserved