2011-10-20 37 views
11

Di que tengo libA. Depende, por ejemplo, de libSomething por el simple hecho de que un método no en línea de libA realiza una llamada a un método en libSomething.h. ¿Cómo se vincula la dependencia en este caso? ¿LibA tiene que vincular estáticamente a libSomething cuando se compila, o un usuario de libA (una aplicación que usa libA) necesita vincularse a libA y libSomething?¿Cómo se relacionan las bibliotecas estáticas con las dependencias?

Gracias

Respuesta

14

vinculación estática es sólo copiar el conjunto de elementos (funciones, constantes, etc) en el ejecutable resultante. Si el código de una biblioteca estática contiene referencias a algunos elementos de la biblioteca compartida, estas referencias se convertirán en dependencias en el ejecutable resultante. Lo mismo ocurre si vincula una biblioteca en lugar de ejecutable.

This thread explica cómo sucede en Linux.

+0

Si no quiero que el ejecutable resultante tenga la carga, ¿qué puedo hacer? – jmasterx

+1

@Milo: podría vincular las bibliotecas estáticas de las dependencias de libSomthing a libA. –

+0

@Milo: es decir, ¿no quieres tener dependencias compartidas? Entonces solo tiene que vincular todo de forma estática, utilizando solo bibliotecas estáticas. Esto dará como resultado un gran ejecutable autónomo sin dependencias. Pero tenga cuidado, es difícil construir algunas bibliotecas como estáticas. – vines

4

Durante el proceso de compilación, el compilador traduce el código en un formato temporal, vamos a llamarlo un archivo de objeto. En el archivo objeto, hay una lista de símbolos que el compilador no pudo resolver, generalmente definiciones en otros lugares. La fase de enlace se encarga de resolver estos símbolos.

El proceso de compilación carga los archivos al enlazador hasta que se resuelvan todos los símbolos. No hay listas de dependencia física, solo listas de símbolos para resolver. Esto permite que los símbolos se resuelvan utilizando diferentes bibliotecas. Por ejemplo, uno puede querer usar una biblioteca de Windows para problemas específicos de Windows; una biblioteca de Linux para problemas específicos de Linux. Esto no establece explícitamente que un programa depende de una biblioteca de Windows; también podría depender del Linux.

Algunos compiladores pueden generar listas de dependencias, generalmente para el uso en un proceso de compilación. Sin embargo, la responsabilidad final depende del programador.

6

Una biblioteca estática es más o menos un archivo simple de archivos de objetos binarios no vinculados (* .o o * .obj), al compilar el archivo, no se realiza ninguna comprobación de las dependencias. Cuando se vincula el ejecutable binario de uno (o biblioteca/DLL compartido), el vinculador comprueba todas las dependencias necesarias y solo entonces le alerta de cualquier problema.

Cuestiones relacionadas