Bibliotecas de Linux: bibliotecas estáticas y compartidas

1. El concepto de archivos de biblioteca

Una biblioteca es una colección de métodos precompilados (archivos .o). La ubicación de la biblioteca almacenada en el sistema Linux es generalmente: /lib y /usr/lib.

En los sistemas de 64 bits, algunas bibliotecas también se pueden almacenar en /usr/lib64. Los archivos de encabezado de la biblioteca generalmente se almacenan en /usr/include o sus subdirectorios.

Hay dos tipos de bibliotecas, una es una biblioteca estática y su regla de comando es libxxx.a, y la otra es una biblioteca compartida y su regla de comando es libxxx.so.

2. Biblioteca estática y biblioteca compartida

Si existen tanto la biblioteca estática como la biblioteca compartida, se preferirá la biblioteca compartida.

1. Cómo usar la biblioteca estática

Incluya directamente la implementación de los métodos en la biblioteca estática que se utilizará en un programa principal ejecutable.

【ejemplo】

Si ha implementado dos métodos add y max usted mismo, estas dos implementaciones están en un archivo de biblioteca estático, asumiendo que el nombre del archivo de biblioteca es libfoo.a, y luego escribe un programa main.c usted mismo y lo llama en main.c Add método, primero compile main.c en el archivo de instrucciones binarias main.o. Luego viene el paso de vinculación.Al vincular, no solo se usa la biblioteca libfoo.a que almacena los métodos implementados por sí misma, sino que también se usa una copia de los métodos en la biblioteca estática libfoo.a para vincular. También se usarán algunas otras bibliotecas. Primero, antes de ejecutar la función principal, necesitamos ejecutar algunos códigos, que están directamente vinculados desde algunos archivos .o, y el programa principal de la función principal se llamará en estos códigos. Por lo tanto, tenemos para implementar un método principal como una entrada. En segundo lugar, algunas bibliotecas estándar, como la biblioteca C donde se encuentra el método implementado por printf, también deben vincularse. El programa principal ejecutable final generado incluye el archivo .c escrito por mí mismo y los métodos en la biblioteca vinculada.

2. Cómo utilizar la biblioteca compartida

Solo marca los métodos utilizados en la biblioteca compartida y no incluye la implementación de los métodos en la biblioteca compartida en un programa ejecutable principal.

【ejemplo】

Si implementa dos métodos add y max usted mismo, estas dos implementaciones están en un archivo de biblioteca estático, suponiendo que el nombre del archivo de la biblioteca sea libfoo.so, y luego escriba un programa main.c usted mismo, llámelo en el método main.c Add, primero compila main.c en el archivo de instrucciones binarias main.o. Luego viene el paso de vinculación. Al vincular, primero, una parte del código se ejecutará antes de que se ejecute la función principal. Estos códigos se vinculan desde algunos archivos .o. Segundo, vincularemos bibliotecas estándar como la biblioteca C. , Tercero, marque el método add utilizado en la biblioteca compartida.

Ahora hay un programa principal simple:

inserte la descripción de la imagen aquí

Compruebe la biblioteca compartida de este programa principal y descubra que la biblioteca C estará vinculada de forma predeterminada, y libc.so es la biblioteca C:

inserte la descripción de la imagen aquí

3. Ventajas y desventajas de las bibliotecas estáticas y bibliotecas compartidas

(1) biblioteca estática

Ventajas:
Incluya la implementación de los métodos en la biblioteca utilizada en su propio programa ejecutable, que se ha convertido en parte del programa ejecutable, y no buscará la biblioteca utilizada cuando se ejecuta, y eliminará esta biblioteca Tampoco tiene efecto. Incluya todas las bibliotecas utilizadas en su propio programa ejecutable, independientemente de si hay un programa de biblioteca correspondiente en este entorno, se puede ejecutar.

Desventajas:
① Ocupa mucha memoria;
② No es conveniente actualizar la biblioteca, y el programa debe volver a compilarse al actualizar la biblioteca.

(2) Biblioteca compartida

Ventajas:
① Pequeña ocupación de memoria;
② La actualización de la biblioteca es muy conveniente, simplemente sobrescriba la biblioteca antigua con la nueva biblioteca

Desventajas:
no incluido, debe encontrar la biblioteca que se utilizará en tiempo de ejecución y vincular dinámicamente la biblioteca correspondiente, por lo que todas las bibliotecas compartidas que deben usarse deben existir en la computadora que ejecuta el programa, una vez que la biblioteca correspondiente no existe , el programa no puede ejecutarse.

3. Generación y uso de librerías estáticas

los archivos de encabezado están en/usr/include

Los archivos de la biblioteca están todos en /usr/libo/lib

Los ejecutables /usr/binson/bin

1. Pasos para generar una biblioteca estática:

Ejemplo: actualmente hay un archivo add.c y max.c, tanto add.c como max.c se declaran en un archivo de encabezado foo.h:

inserte la descripción de la imagen aquí

(1) En el primer paso, compile todos los archivos .c en archivos .o:

inserte la descripción de la imagen aquí

(2) En el segundo paso, empaque los archivos .o en una biblioteca y use el comando ar para generar una biblioteca estática para todos los archivos ".o" compilados en el primer paso

Los siguientes add.o max.oarchivos se generan como una biblioteca estática libfoo.a:

inserte la descripción de la imagen aquí

para ar crv libfoo.a add.o max.oel

ares un comando

crvIn:
c es para crear la biblioteca
r es para agregar el método a la biblioteca
v es para mostrar el proceso

libfoo.aes el nombre de la biblioteca creada

add.o max.oes el archivo .o que se empaquetará en la biblioteca

2. Uso de librerías estáticas

(1) Primero crea un directorio liba

Copie el archivo de encabezado foo.h y la biblioteca estática libfoo.a en este directorio:

inserte la descripción de la imagen aquí

(2) Cree un archivo main.c y escriba el código de prueba

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

(3) Genere un archivo ejecutable y ejecútelo

① Compile directamente el archivo main.c (fallido)

inserte la descripción de la imagen aquí

Motivo: No hay implementación del método add en este directorio.

② Genere el archivo main.o y luego compile el archivo main.c (fallo)

inserte la descripción de la imagen aquí

Motivo de la falla: gcc -o main main.ono se pudo encontrar el método de agregar en el momento del enlace

③ Al vincular, especifique una biblioteca estática para generar un archivo ejecutable (éxito)

inserte la descripción de la imagen aquí

④ Genere archivos ejecutables directamente a través de main.c y bibliotecas estáticas (éxito)

inserte la descripción de la imagen aquí
gcc -o main main.c -L -lfooen la declaración de compilación

-L: especifique la ruta de almacenamiento de la biblioteca
-l: especifique el nombre de la biblioteca (la 'lib' anterior y la extensión '.a' no son necesarias).

Si la biblioteca está en la biblioteca estándar, no es necesario especificar la ruta a la biblioteca en el momento de la compilación.

(4) Después de eliminar la biblioteca estática libfoo.a, el archivo ejecutable principal aún puede ejecutarse

inserte la descripción de la imagen aquí

Cuarto, la generación y uso de bibliotecas compartidas.

1. Generación de biblioteca compartida

1. Pasos para generar una biblioteca compartida:

Ejemplo: actualmente hay un archivo add.c y max.c, tanto add.c como max.c se declaran en un archivo de encabezado foo.h:

inserte la descripción de la imagen aquí

(1) En el primer paso, compile todos los archivos .c en archivos .o

inserte la descripción de la imagen aquí

(2) En el segundo paso, empaque los archivos .o en una biblioteca y use el comando gcc para generar todos los archivos ".o" compilados en el primer paso en una biblioteca compartida

inserte la descripción de la imagen aquí
gcc -shared -fPIC -o libfoo.so add.o max.oEn el comando para generar la biblioteca compartida :

gccIndica que el comando
-sharedsignifica que la biblioteca compartida generada significa
-fPICque la posición del código es independiente
-osignifica que la salida
libfoo.soes la biblioteca compartida generada El nombre de la biblioteca compartida
add.o max.oes el archivo .o que se empaquetará en la biblioteca

2. Uso de bibliotecas compartidas

(1) Primero crea un directorio liba

Mueva la biblioteca compartida libfoo.so y el archivo de encabezado foo.h a liba:

inserte la descripción de la imagen aquí

(2) Cree un archivo main.c y escriba el código de prueba

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

(3) Generar archivos ejecutables

① Compilar directamente para generar un archivo ejecutable (fallo)

inserte la descripción de la imagen aquí

Motivo del error: no se puede encontrar la implementación del método add y no hay una implementación del método add en main.c

② Cree el ejecutable usando la biblioteca compartida "libfoo.so" y "main.c" (éxito)

inserte la descripción de la imagen aquí

En declaración de compilación gcc -o main main.c -L. -lfoo:

-L: especifique la ruta de almacenamiento de la biblioteca
-l: especifique el nombre de la biblioteca (la 'lib' anterior y la extensión '.so' no son necesarias)

Si hay bibliotecas compartidas y bibliotecas estáticas con el mismo nombre en la ruta de almacenamiento de la biblioteca, gcc usa la biblioteca compartida de manera predeterminada.

(4) ejecutar (falla)

inserte la descripción de la imagen aquí

Análisis de las razones de falla:

Primero, verifique qué bibliotecas usa el programa principal:

inserte la descripción de la imagen aquí

Se encuentra que libfoo.so no se encuentra. Esto se debe a que al buscar bibliotecas en tiempo de ejecución, solo las buscará en el directorio estándar. gcc -o main main.c -L. -lfooLa ruta especificada es para decirle a gcc que vaya a esta ruta para encontrar las bibliotecas requeridas. al compilar.

Solución:

① Use algunas variables de entorno para especificar que el programa principal busque la biblioteca requerida en el directorio actual al cargar la biblioteca

Primero configure la variable "LD_LIBRARY_PATH" como la ruta actual, y aún no se ejecutará en este momento:

inserte la descripción de la imagen aquí
Luego configure la variable "LD_LIBRARY_PATH" como una variable de entorno para que se ejecute correctamente:

inserte la descripción de la imagen aquí

②Coloque las bibliotecas requeridas en el directorio estándar (operar en modo administrador)

inserte la descripción de la imagen aquí

[Nota] Si la biblioteca dinámica se mueve al directorio estándar y se establece la variable de entorno, se preferirá la variable de entorno para encontrar la ubicación de la biblioteca.

En este momento, se encuentra que se ha encontrado libfoo.so, y el programa principal se puede ejecutar en este momento:

inserte la descripción de la imagen aquí

(5) Después de eliminar la biblioteca compartida libfoo.b, el archivo ejecutable principal no puede ejecutarse

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/NuYoaH502329/article/details/132250435
Recomendado
Clasificación