Esta es mi segunda publicación en este sitio en mi esfuerzo por comprender el proceso de compilación/vinculación con gcc. Cuando intento hacer un ejecutable, los símbolos deben resolverse en el momento del enlace, pero cuando intento crear una biblioteca compartida, los símbolos no se resuelven en el momento del enlace de esta biblioteca. Quizás se resolverán cuando intente hacer un ejecutable usando esta biblioteca compartida. Manos a la obra:¿Por qué los símbolos de una biblioteca compartida no se resuelven en el momento del enlace?
bash$ cat printhello.c
#include <stdio.h>
//#include "look.h"
void PrintHello()
{
look();
printf("Hello World\n");
}
bash$ cat printbye.c
#include <stdio.h>
//#include "look.h"
void PrintBye()
{
look();
printf("Bye bye\n");
}
bash$ cat look.h
void look();
bash$ cat look.c
#include <stdio.h>
void look()
{
printf("Looking\n");
}
bash$ gcc printhello.c printbye.c
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
/tmp/cck21S0u.o: In function `PrintHello':
printhello.c:(.text+0x7): undefined reference to `look'
/tmp/ccNWbCnd.o: In function `PrintBye':
printbye.c:(.text+0x7): undefined reference to `look'
collect2: ld returned 1 exit status
bash$ gcc -Wall -shared -o libgreet printhello.c printbye.c
printhello.c: In function 'PrintHello':
printhello.c:6: warning: implicit declaration of function 'look'
printbye.c: In function 'PrintBye':
printbye.c:5: warning: implicit declaration of function 'look'
Así que mi pregunta es por qué los símbolos no se resuelven cuando estoy vinculando una biblioteca compartida. Este trabajo (Resolver los símbolos de su cadena descendente) deberá realizarse cuando utilizaré esta biblioteca para hacer un ejecutable, pero eso significa que necesitamos saber de qué depende esta biblioteca cuando se utiliza esta biblioteca, pero ¿no es deseable?
Gracias, Jagrati
¿Por qué se modificó esta opción? Tenga en cuenta que en OSX puede usar la opción '-flat_namespace' para que se comporte como otros sistemas operativos, por ej. Linux. – Troubadour