Voici un objet simple, mis en place en tant que bibliothèque partagée :
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct OBJDATA { char *name; int version; } OBJDATA; void *init(char *name) { OBJDATA *data=(OBJDATA*)calloc(1,sizeof(OBJDATA)); if(name) data->name=malloc(strlen(name)+1); strcpy(data->name, name); printf("Cree : %s\n", name); return data; } void montre(void *data) { OBJDATA *d=(OBJDATA*)data; printf("Montre : %s\n", d->name); } void detruit(void *data) { OBJDATA *d=(OBJDATA*)data; if(d) { if(d->name) {printf("Destruction : %s\n", d->name); free(d->name); } free(d); } }
L'objet offre trois fonctions d'interface :
Pour constituer la bibliothèque partagée libdobj.so
, procéder comme suit :
gcc -fPIC -c obj.c gcc -shared -W1,-soname,libdobj.so.1 -o libdobj.so.1.0 obj.o ln -s libdobj.so.1.0 libdobj.so.1 ln -s libdobj.so.1 libdobj.so export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
Une fois testée, la bibliothèque peut être intallée dans un endroit standard, comme le répertoire /usr/local/lib/
, après quoi il faut lancer ldconfig
pour mettre à jour le lien entre libdobj.so.1
et libdobj.so.1.0
:
ln -s libdobj.so.1 libdobj.so
Il faut maintenant un programme qui teste cette nouvelle bibliothèque, qui appelle cette bibliothèque par un #include <dlfcn.h>
:
#include <dlfcn.h> #include <stdio.h> void main(void) { void *dlobj; void * (*init_appel)(char *name); void (*show_appel)(void *data); void (*destroy_appel)(char *data); if(dlobj=dlopen("libdobj.so.1", RTLD_LAZY)) { void *data; init_appel=dlsym(dlobj,"init"); show_appel=dlsym(dlobj,"montre"); destroy_appel=dlsym(dlobj,"detruit"); data=(*init_appel)("Test Objets"); (*show_appel)(data); (*destroy_appel)(data); } }
Il faut ensuite compiler ce programme :
gcc -o dltest dltest.c -ldl
Il ne reste plus qu'à tester le programme :
dltest
Le résultat s'affiche alors :
Cree : Test Objets Montre : Test Objets Destruction : Test Objets