Это - мое 2-е сообщение на этом сайте в моем усилии понять процесс компиляции/соединения с gcc. Когда я пытаюсь сделать исполняемый файл, символы должны быть разрешены во время ссылки, но когда я пытаюсь сделать общую библиотеку, символы не разрешены во время ссылки этой библиотеки. Они будут, возможно, разрешены, когда я попытаюсь сделать исполняемый файл, пользующийся этой общей библиотекой. Практический:
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'
Таким образом, мой вопрос состоит в том, почему символы не разрешены, когда я связываю общую библиотеку. Эта работа (Разрешение символов его нисходящего потока) должна будет быть сделана, когда я буду пользоваться этой библиотекой для создания исполняемого файла, но это означает, что мы должны знать то, от чего эта библиотека зависит при пользовании этой библиотекой, но не является ею не нежелательный?
Спасибо, Jagrati
Делает ли добавление -z defs
при сборке библиотеки то, что вы хотите? Если нет, посмотрите справочные страницы ld, там довольно много опций по обработке неопределенных символов.
Связанный не имеет возможности узнать, по крайней мере в ELF, где находятся символы (т.е. в каких библиотеках). В OS X, с другой стороны, вам нужно связать библиотеки так, как вы описали. В конце концов, это вопрос дизайна. Один более гибкий, другой более строгий.
Я думаю, что опция компоновщика -Bsymbolic
- это то, что вы ищете.
Даже когда вы создаете разделяемую библиотеку, она должна разрешить все зависимости.
Таким образом, когда разделяемая библиотека загружается во время компиляции, она знает, какие другие разделяемые библиотеки загружать во время выполнения, чтобы она могла разрешить другие зависимости.
1) Создайте общую (look.
2) Создайте общую (hg.
3) Создайте приложение с main (), которое ссылается на hg.
Затем во время выполнения приложение загрузит hg.
Исполняемый файл требует точки входа. Но общая библиотека может быть собрана без точки входа, а затем исполняемый файл может быть скомпилирован с этой общей библиотекой.