Linux ld link cómo ordenar

  

conector del sistema Linux ld link es muy importante, si el orden no es correcto, se producirá un error de función de referencia indefinida, la siguiente serie le mostrará cómo organizar la conexión en Linux El orden en que ld está vinculado.

ld orden original para una serie de biblioteca de vínculos es muy sensible, de lo contrario se informará undefined referencia a un símbolo de la función de error, lo que significa que no se encuentra la definición de la función. De hecho, la biblioteca se puede abrir correctamente. Si la biblioteca libA.a depende de la biblioteca libB.a, entonces el argumento del conector debe ser ln -lA -lB, que debe escribirse así. De lo contrario estará mal.

Esto parece ser un legado de la historia. Para decirlo sin rodeos, si determina que una biblioteca no es importante, se pone al final, es decir, el orden en el que se cargan las bibliotecas está en orden, de izquierda a derecha, con la mayor prioridad, por lo que las máquinas en los tiempos antiguos estaban demasiado rotas. Los discos internos y duros, incluida la CPU, son extremadamente raros y preciosos. Por lo tanto, necesita obtener lo que necesita con anticipación y no lo necesita. Una vez que lo necesite, cárguelo. No lo cargue si no lo necesita. Esto puede explicar el error anterior, el compilador cargado en socketcomm, encontró que hay una biblioteca de dependencias, y luego búsquelo, hay una falla, por lo que está mal.

En otras palabras, las dependencias se colocan en la medida de lo posible para que todos puedan compartirlas.

Esto lleva a otro problema. Si hay varias bibliotecas que usan el mismo nombre de función o clase, ¿qué sucede con el nombre de la estructura?

Puede usar nm y readelf, ldd y otros comandos para ver las dependencias de su biblioteca, las tablas de símbolos y los símbolos de función exportados. Esto le permitirá verificar los diferentes resultados de compilación anteriores debido al pedido.

Divida la biblioteca de prueba en dinámica y dinámica, estática y estática;

El primer caso: la biblioteca estática contiene la misma función de nombre

El código es el siguiente:

gcc -L./main.c -lA -lB

Error de compilación, en definición múltiple de `XXX ‘. Repita la función de definición.

El segundo caso: la biblioteca en movimiento

Esto depende del orden de carga, como se mencionó anteriormente, comenzando desde la izquierda, cargando según sea necesario.

El código para el código es el siguiente:

gcc main.c. /libB.so. /libA.so

El código para el código es el siguiente:

gcc main.c. /libA.so. /libB.so

Este enlace está vinculado de manera implícita, o un enlace de tiempo de carga, mientras que la biblioteca estática anterior es una conexión de tiempo de compilación.

Es decir, el orden de compilación determina a qué biblioteca de la biblioteca se llama con el mismo nombre.

El tercer caso: carga en movimiento, pero dinámica, no la carga estática anterior.

El código para el código es el siguiente:

gcc main.c -ldl. /libA.so. /libB.so

El código para el código es el siguiente:

gcc main.c -ldl. /libB.so. /libA.so

Cuando no hay opción de enlace, es lo mismo que en el segundo caso. Después de agregar la opción L, especifique cuál cargar.

libB es un enlace estático! , libA se carga dinámicamente.

El código del código es el siguiente:

gcc -L./main.c -ldl – lB

El nombre de la biblioteca de la biblioteca dinámica se muestra en la opción de compilación. >

El código para el código es el siguiente:

gcc -L./main.c -ldl -lB. /libA.so

El código para el código es el siguiente:

gcc -L./main.c -ldl. /libA.so -lB

Cuando hay estática y dinámica, no agregue el nombre de la biblioteca de la biblioteca dinámica a la opción de compilación, la salida es normal. Si se agrega, la biblioteca estática está relacionada principalmente con el orden de los enlaces.

Lo anterior es la introducción del orden de enlace ld del conector en el sistema Linux. Un orden diferente dará como resultado resultados de compilación diferentes. Por lo tanto, debe colocarse lo más lejos posible después de la dependencia. ¿Recuerda?

Copyright © Conocimiento de Windows All Rights Reserved