Мое первое сообщение на этом сайте с огромной надеждой :: Я пытаюсь понять статические ссылки, динамические ссылки, общие библиотеки, статические библиотеки и т. Д., С gcc. Каждый раз, когда я пытаюсь вникать в эту тему, у меня есть кое-что, что я не совсем понимаю.в 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 перед запуском приветствовать (или связать его с опцией RPATH) я могу заставить его работать.
Мой вопрос, однако, различен: Поскольку я все равно использую общую библиотеку, невозможно ли принудительное разрешение символа во время выполнения (не уверены в терминологии, но, возможно, называются динамическими связями в соответствии с книгой «Линкеры и загрузчики») , Я понимаю, что мы не хотим этого делать, потому что это заставляет программу работать медленно и имеет накладные расходы каждый раз, когда мы хотим запустить программу, но я пытаюсь понять это, чтобы очистить мои концепции.
Обеспечивает ли gcc-компоновщик любую возможность задержки разрешения символов во время выполнения? (чтобы сделать это с помощью библиотеки, на которой мы на самом деле будем запускать программу) (поскольку библиотека, доступная во время компиляции, может отличаться от той, которая доступна во время выполнения, если какие-либо изменения в библиотеке) Я хочу быть в состоянии сделать так :
bash $ gcc main.c -I.
(что нужно здесь?) , так что мне не нужно указывать имя библиотеки, и просто скажите, что я хочу сделать разрешение символа во время выполнения, поэтому заголовки сейчас достаточно хороши, фактические имена библиотек не нужны.
Спасибо, Ученик навсегда.
http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html – adf88
Убедитесь, что вы пометили вопрос на соответствующем языке. Он помечен как C++, но код C. Обратите внимание, что для возможности использования чистой динамической библиотеки для загрузки кода на C++ необходимо будет содержать лишний «extern» C «разбрызганный вокруг, который не нужен и не действителен в C. –