next up previous contents index
Next: RCS, contrôle de versions Up: Utilisation de bibliothèques partagées Previous: Mettre à jour les

   
Création d'une bibliothèque partagée

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 :

1.
init, pour attribuer toute la mémoire nécessaire (stockage, rangement) et pour initialiser l'objet.

2.
show, pour afficher l'objet (ici, cela imprime simplement un message).

3.
destroy, pour libérer de la mémoire.

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



MATHIEU DECORE
1999-11-03
Merci de me dire ce que pensez de ce document.