Exemple de chargement et creation de bibliotheque partagee sous linux

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 556 fois - Téléchargée 34 fois

Contenu du snippet

Ce programme est un exemple d'appel de bibliothèque partagée à chargement dynamique sous Linux. (Pour exemple la bibliothèque présente sur ce site)
L'appel tel qu'il est décrit ici risque de poser des problèmes en C++.

Source / Exemple :


#include <dlfcn.h>
#include <stdio.h>

void*(*lib_search_call)(void*key,void*base,int arg3,int arg4,
                              int arg5,int arg6);

void*call_sort;

struct ele_m;
{
  float *member1;
  float *member2;
  float *member_ref;
  } ;
typedef struct ele_m elem ;
elem array_enr[6];

int main()
{

int i;
float *val_1,*val_2,*val_3;
float search;
void*retour;
int *result;

printf("on entre les données dans le tableau de structures :\n");
for(i=0;i<6;i++)
{
  printf("enregistrement :%d\n", i);
  printf("\n");
  printf("valeur**donnée 1 structure** entrer un nombre :");
  scanf("%f", &val_1);
  printf("valeur**donnée 2 structure** entrer un nombre :");
  scanf("%f", &val_2);
  printf("valeur**donnée 3 structure** entrer un nombre :");
  scanf("%f", &val_3);
  array_enr[i].member1=val_1;
  array_enr[i].member2=val_2;
  array_enr[i].member3=val_3;
}
printf("**recherche**entrer un nombre :");
scanf("%f", &search);  
if(call_sort=dlopen("/usr/local/lib/lib.so.x.x",RTLD_LAZY))
 {
   lib_search_call=dlsym(call_sort,"lib_search");
   retour=(*lib_search_call)(&search,&array_enr[0].member3,6,1,12,4);
   result=retour;
   printf("%d", *result);
}
}

/*
  Code librairie
  Ne pas inclure dans le programme principal!

  • /
#define TRUE 1 #define FALSE -1 void*lib_search(void*key,void*base,int arg3,int arg4, int arg5, arg6) { float *v_receive_float, *sup_float; void*ptr; int TROUVE, middle, right, left; switch (arg6) { case 4: v_receive_float=key; break; /* à completer si besoin...
  • /
default : break ; } right = arg3-1; left=0; middle =-1; TROUVE=FALSE; while((left<right)&&(!TROUVE)) { middle=(left+right)/2; sup_float=base+(middle*arg5* arg4); if(*sup_float==*v_receive_float) { TROUVE=TRUE; } else if(*v_receive_float>*sup_float) { left=middle+1; } else { right=middle-1; } } ptr=&middle; return ptr; }

Conclusion :


Directives de compilation
principal :
gcc -o test test.c -ldl
bibliothèque :
mettre dans un répertoire ici /usr/local/lib
gcc -fpic -lib.c
gcc -shared -w1, -soname, lib.so.0 -o lib.so.0.x lib.o

A voir également

Ajouter un commentaire

Commentaires

ToasTy62
Messages postés
47
Date d'inscription
mardi 4 septembre 2001
Statut
Membre
Dernière intervention
12 mars 2004
-
rah exactement ske je cherchais marchi boucouuuu !!!
pr c++ des pbs? ta une autre solution sinon ?
ezaremba
Messages postés
1
Date d'inscription
lundi 29 septembre 2003
Statut
Membre
Dernière intervention
17 novembre 2005
-
Un grand merci. Visiblement ce post date un peu, mais ce genre d'exemple semble pas très répendu sur le net!

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.