Мой первый пост на этом сайте с огромной надеждой: я пытаюсь понять статические ссылки, динамические ссылки, общие библиотеки, статические библиотеки и т. Д. С помощью gcc.Каждый раз, когда я пытаюсь углубиться в эту тему, у меня появляется что-то, что я не совсем понимаю.
Некоторые практические работы:
bash$ cat main.c
#include "printhello.h"
#include "printbye.h"
void main()
{
PrintHello();
PrintBye();
}
bash$ cat printhello.h
void PrintHello();
bash$ cat printbye.h
void PrintBye();
bash$ cat printbye.c
#include <stdio.h>
void PrintBye()
{
printf("Bye bye\n");
}
bash$ cat printhello.c
#include <stdio.h>
void PrintHello()
{
printf("Hello World\n");
}
gcc -Wall -fPIC -c *.c -I.
gcc -shared -Wl,-soname,libcgreet.so.1 -o libcgreet.so.1.0 *.o
ln -sf libcgreet.so.1.0 libcgreet.so
ln -sf libcgreet.so.1.0 libcgreet.so.1
Итак, я создал общую библиотеку.Теперь я хочу связать эту общую библиотеку с моей основной программой для создания исполняемого файла.
gcc -Wall -L. main.c -lcgreet -o greet
Это очень хорошо работает, и если я установлю LD_LIBRARY_PATH перед запуском greet (или свяжу его с опцией rpath), я смогу заставить его работать.
Мой вопросоднако отличается: поскольку я в любом случае использую разделяемую библиотеку, невозможно ли принудительно разрешать символы во время выполнения (не уверен насчет терминологии, но, возможно, это называется динамическим связыванием в соответствии с книгой «Линкеры и загрузчики»).Я понимаю, что мы, возможно, не захотим делать это, потому что это замедляет работу программы и приводит к накладным расходам каждый раз, когда мы хотим запустить программу, но я пытаюсь понять это, чтобы очистить мои концепции.
Предоставляет ли компоновщик gccЛюбой вариант отложить разрешение символов во время выполнения?(чтобы сделать это с библиотекой, с которой мы фактически собираемся запустить программу) (поскольку библиотека, доступная во время компиляции, может отличаться от библиотеки, доступной во время выполнения, если какие-либо изменения в библиотеке), я хочу иметь возможность делать что-то вроде:
bash $ gcc main.c -I.
(какая опция здесь нужна?), Чтобы мне не приходилось давать имя библиотеки, и просто сказать ей, что я хочу сделать разрешение символов во время выполнения, чтобы заголовки были достаточно хороши на данный момент, фактическая библиотекаимена не нужны.
Спасибо, ученик навсегда.