Если я создаю общую библиотеку (общий объект), я могу использовать ее двумя следующими способами:
Первый способ - использовать общую библиотеку, как если бы я использовал статическую библиотеку.
#include "myLib.h"
//...
//afterwards I can use functions defined in mylib.h
myFunction();
Второй способ использования общей библиотеки - это вызов функций API динамического загрузчика: dlopen
, dlsym
, и dlclose
из dlfcn.h
. Я бы использовал разделяемую библиотеку таким образом, например, когда хочу реализовать шаблон плагина. Листинг будет выглядеть так:
#include <dlfcn.h>
void *myLib; /* Handle to shared lib file */
void (*myFunction)(); /* Pointer to loaded function */
//...
//load shared object
myLib = dlopen("/home/dlTest/myLib.so",RTLD_LAZY);
dlerror();
//get handle to function
myFunction = dlsym( myLib, "myFunction");
dlerror();
//execute function
(*myFunction)();
//close lib
dlclose(myLib);
dlerror();
Теперь мой первый вопрос : в чем разница между этими двумя способами использования общего объекта с точки зрения времени загрузки? Используя общую библиотеку в первом случае, мы связываем / загружаем общую библиотеку в основное приложение во время загрузки, а во втором случае мы делаем то же самое во время выполнения?
Второй вопрос . Как называются эти два обычаев? Первая называется статически связанной общей библиотекой, а вторая - динамически подключаемой / загружаемой общей библиотекой?
Третий вопрос Создал ли я общую библиотеку без флага -fPIC
(независимый от позиции код ), смогу ли я использовать его вторым способом?
Ура