Exemple de chargement et creation de bibliotheque partagee sous linux

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

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.