Se creo una libreria condivisa (oggetto condiviso), posso usarla in due modi:
Il primo modo è usare una libreria condivisa come farei con una libreria statica.Dilemma sulle librerie condivise su Unix
#include "myLib.h"
//...
//afterwards I can use functions defined in mylib.h
myFunction();
Il secondo modo di usare libreria condivisa è chiamando funzioni API caricatore dinamico: dlopen
, dlsym
, e dlclose
da dlfcn.h
. Vorrei usare la libreria condivisa in questo modo quando voglio implementare un pattern di plugin, per esempio. Listing sarebbe simile a questa:
#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();
Ora la mia prima domanda è: qual è la differenza tra questi due usi di oggetto condiviso in termini di tempi di caricamento? Utilizzando la libreria condivisa nel primo modo, stiamo collegando/caricando la libreria condivisa all'app principale in tempo di caricamento e nel secondo modo stiamo facendo la stessa cosa in fase di esecuzione?
Seconda domanda. Qual è il nome di questi due usi? La prima è chiamata libreria condivisa collegata staticamente e la seconda è una libreria condivisa collegata/caricata dinamicamente?
Terza domanda Se ho costruito una libreria condivisa, senza -fPIC
bandiera (codice indipendente osizione), dovrei essere in grado di usarlo in un secondo modo?
Acclamazioni
Se cambio una libreria condivisa e la ricompilifico, devo ricollegare tutte le applicazioni principali che usano quella lib condivisa se sto usando il collegamento implicito o è fatto automaticamente quando quelle applicazioni caricano? –