Linux Algunos conceptos sobre bibliotecas de enlaces dinámicos y bibliotecas de enlaces estáticos

  
 Introducción a la biblioteca

La biblioteca tiene dinámica y estática. La dinámica generalmente usa .so como sufijo y estática como .s. Por ejemplo: libhello.so libhello.a

Para usar diferentes versiones de la biblioteca en el mismo sistema, puede agregar el número de versión al sufijo después del nombre del archivo de la biblioteca, por ejemplo: libhello.so.1.0, debido a la conexión predeterminada del programa Utilice .so como la extensión de archivo. Entonces, para usar estas bibliotecas, es común usar una forma de establecer conexiones simbólicas.
ln -s libhello.so.1.0 libhello.so.1ln -s libhello.so.1 libhello.so usando la biblioteca

Cuando quiera usar una biblioteca estática, el conector encontrará el programa Las funciones requeridas se copian al archivo ejecutable. Dado que esta copia está completa, una vez que la conexión se realiza correctamente, la biblioteca estática ya no es necesaria. Sin embargo, este no es el caso de las bibliotecas dinámicas. La biblioteca dinámica dejará una marca en el ejecutor "lsquo;" indica que cuando se ejecuta el programa, primero se debe cargar la biblioteca. Como la biblioteca dinámica ahorra espacio, la operación predeterminada para conectarse a Linux es conectar primero la biblioteca dinámica, es decir, si hay bibliotecas estáticas y dinámicas al mismo tiempo, si no se especifica, se conectará con la biblioteca dinámica.

Ahora supongamos que hay un paquete de desarrollo de programa llamado hola, que proporciona una biblioteca estática libhello.a una biblioteca dinámica libhello.so, un archivo de encabezado hola.h, el archivo de cabecera proporciona la función sayhello ()
/* hello.h * /void sayhello ();

También hay algo de documentación. Esta es la estructura típica de un paquete de desarrollo de programas

1. Conéctese con la biblioteca dinámica.

Linux se conecta por defecto con la biblioteca dinámica, el siguiente programa testlib.c usa sayhello () en la biblioteca de hello Función
/*testlib.c*/#include#includeint main () {sayhello (); return 0;}

Compile con el siguiente comando
$ gcc -c testlib.c -o testlib.o

Conéctese con el siguiente comando:
$ gcc testlib.o -lhello -o testlib

Tenga en cuenta que al conectarse, suponga que tanto libhello.so como libhello.a están en la ruta de búsqueda de biblioteca predeterminada /usr /Bajo lib, si desea agregar el parámetro -L a otras ubicaciones

2. Conectar con la biblioteca estática

Es problemático conectarse con la biblioteca estática, principalmente el problema de los parámetros. O el ejemplo anterior:
$ gcc testlib.o -o testlib -WI, -Bstatic -lhello

Nota: Este parámetro especial " -WI, -Bstatic " en realidad se pasa al conector ld Indica que está conectado a una biblioteca estática. Por supuesto, si solo hay una biblioteca estática en el sistema, este parámetro no es necesario.

Si desea conectarse con varias bibliotecas, y cada una está conectada de manera diferente, por ejemplo, el programa anterior debe estar estáticamente conectado con libhello y conectado dinámicamente con libbye. El comando debe ser:
$ gcc testlib.o -o testlib -WI, -Bstatic -lhello -WI, -Bdynamic -lbye

3. Problema de ruta para bibliotecas dinámicas

Para que el ejecutable pueda encontrar la biblioteca dinámica sin problemas, Hay tres formas:

(1) Copie la biblioteca en los directorios /usr /lib y /lib.

(2) Agregue la ruta de la biblioteca en la variable de entorno LD_LIBRARY_PATH. Por ejemplo, la biblioteca dinámica libhello.so está en el directorio /home /ting /lib, usando bash como ejemplo. Use el comando:
$ export LD_LIBRARY_PATH = $ LD_LIBRARY_PATH: /home /ting /lib

(3) Modify /etc /El archivo ld.so.conf agrega la ruta donde reside la biblioteca al final del archivo y realiza una actualización de ldconfig. De esta manera, todos los archivos de la biblioteca en el directorio agregado son visibles

4. Ver los símbolos en la biblioteca

A veces puede ser necesario verificar qué funciones hay en una biblioteca, el comando nm puede imprimir la biblioteca. Todos los símbolos involucrados. Las bibliotecas pueden ser estáticas o dinámicas. Hay muchos símbolos listados en nm, hay tres comunes, uno se llama en la biblioteca, pero no está definido en la biblioteca (lo que indica que se necesita otro soporte de biblioteca), representado por U; uno es la función definida en la biblioteca, Este es el más común con T, el otro es el llamado símbolo "débil", que se define en la biblioteca pero puede estar cubierto por símbolos del mismo nombre en otras bibliotecas, denotadas por W. Por ejemplo, supongamos que el desarrollador quiere saber si printf () está definido en la biblioteca de saludo mencionada en la sección anterior:
$ nm libhello.so

Copyright © Conocimiento de Windows All Rights Reserved