Si je construis une bibliothèque partagée (objet partagé), je peux l'utiliser de deux façons:
La première façon est d'utiliser une bibliothèque partagée comme si j'utilisais une bibliothèque statique.Dilemme sur les bibliothèques partagées sous Unix
#include "myLib.h"
//...
//afterwards I can use functions defined in mylib.h
myFunction();
La deuxième façon d'utiliser la bibliothèque partagée est en appelant les fonctions API de chargeur dynamique: dlopen
, dlsym
et dlclose
de dlfcn.h
. J'utiliserais la bibliothèque partagée de cette façon quand je veux implémenter un modèle de plugin, par exemple. Liste ressemblerait à ceci:
#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();
Maintenant, ma première question est: quelle est la différence entre ces deux usages de l'objet partagé en termes de temps de chargement? En utilisant la bibliothèque partagée de la première manière, nous lions/chargons la bibliothèque partagée à l'application principale au moment du chargement et de la deuxième manière, nous faisons la même chose en cours d'exécution?
Deuxième question. Quel est le nom de ces deux usages? La première est appelée bibliothèque partagée statiquement liée et la seconde est une bibliothèque partagée dynamiquement liée/chargée?
Troisième question Si j'ai construit une bibliothèque partagée sans le drapeau -fPIC
(code indépendant de l'osition), serais-je capable de l'utiliser dans un second sens?
Vive
Si je modifie une bibliothèque partagée et que je la recompile, dois-je relier toutes les applications principales qui utilisent cette bibliothèque partagée si j'utilise une liaison implicite ou est-ce fait automatiquement lorsque ces applications sont chargées? –