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