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:
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:
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/lib
o/lib
Los ejecutables /usr/bin
son/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:
(1) En el primer paso, compile todos los archivos .c en archivos .o:
(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.o
archivos se generan como una biblioteca estática libfoo.a
:
para ar crv libfoo.a add.o max.o
el
ar
es un comando
crv
In:
c es para crear la biblioteca
r es para agregar el método a la biblioteca
v es para mostrar el proceso
libfoo.a
es el nombre de la biblioteca creada
add.o max.o
es 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:
(2) Cree un archivo main.c y escriba el código de prueba
(3) Genere un archivo ejecutable y ejecútelo
① Compile directamente el archivo main.c (fallido)
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)
Motivo de la falla: gcc -o main main.o
no 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)
④ Genere archivos ejecutables directamente a través de main.c y bibliotecas estáticas (éxito)
gcc -o main main.c -L -lfoo
en 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
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:
(1) En el primer paso, compile todos los archivos .c en archivos .o
(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
gcc -shared -fPIC -o libfoo.so add.o max.o
En el comando para generar la biblioteca compartida :
gcc
Indica que el comando
-shared
significa que la biblioteca compartida generada significa
-fPIC
que la posición del código es independiente
-o
significa que la salida
libfoo.so
es la biblioteca compartida generada El nombre de la biblioteca compartida
add.o max.o
es 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:
(2) Cree un archivo main.c y escriba el código de prueba
(3) Generar archivos ejecutables
① Compilar directamente para generar un archivo ejecutable (fallo)
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)
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)
Análisis de las razones de falla:
Primero, verifique qué bibliotecas usa el programa principal:
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. -lfoo
La 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:
Luego configure la variable "LD_LIBRARY_PATH" como una variable de entorno para que se ejecute correctamente:
②Coloque las bibliotecas requeridas en el directorio estándar (operar en modo administrador)
[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:
(5) Después de eliminar la biblioteca compartida libfoo.b, el archivo ejecutable principal no puede ejecutarse