Problème : passer une map en paramètre à une librairie dynamique
Bonjour,
Je me trouve confronté à un problème et je ne comprends vraiment pas d'où peut venir cette erreur.
Je travaille sur HP-UX avec le compilateur aCC.
J'ai simplifié mon programme pour l'exemple. Il est composé d'un main et d'un plugin.
J'ai une librairie dynamique qui contient une fonction inversion. Cette fonction prend une map en paramètre.
J'ai une map qui contient 2 éléments.
Je parcours la map dans mon main avant l'appel à cette fonction en affichant les éléments --> OK.
J'appelle la fonction inversion de mon plugin en lui passant la map en paramètre, et dans cette fonction inversion, je parcours la map en affichant les éléments.
Erreur : Seul le premier élément est affiché, le parcours de la map continue comme si ma map contenait une infinité d'éléments vides :?
Je parcours la map dans mon main après l'appel à cette fonction en affichant les éléments --> OK.
Voilà, j'espère sincèrement que ça inspirera quelqu'un, car je deviens fou à chercher ce qui ne va pas :'(
Voilà mon code :
Main.cpp :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| #include <dlfcn.h>
#include <iostream.h>
#include <string>
#include <map>
int main()
{
void* handle;
map<const string,string> contexte;
typedef void (*fonction_t)(map<const string,string> &);
//Ouverture de la librairie
handle = dlopen("plugin.sl", RTLD_LAZY);
if (!handle)
return -1;
//Recuperation de la fonction
fonction_t fonction = (fonction_t) dlsym(handle, "inversion");
const char *dlsym_error = dlerror();
if (dlsym_error)
return -1;
contexte["date"] = "toto";
contexte["message"] = "pouet";
map<const string,string>::iterator it;
//Affichage avant appel fonction plugin
for(it=contexte.begin();it!=contexte.end();it++)
cout << it->first << " : " << it->second << endl;
cout << "//////////////////////" << endl;
//Appel fonction plugin
fonction(contexte);
cout << "//////////////////////" << endl;
//Affichage apres fonction plugin
for(it=contexte.begin();it!=contexte.end();it++)
cout << it->first << " : " << it->second << endl;
dlclose(handle);
return 0;
} |
Plugin.cpp :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include <iostream.h>
#include <string>
#include <map>
extern "C" void inversion(map<const string,string> & contexte)
{
map<const string,string>::iterator it;
int i=0;
for(it=contexte.begin();it!=contexte.end();it++,i++)
{
cout << it->first << " : " << it->second << endl;
if (i==5)
{
cout << "Break car boucle infinie..." << endl;
break;
}
}
} |
Mon makefile (les options pour la compilation diffèrent de gcc pour les librairies dynamiques ;) )
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| CC = aCC
CFLAGS = -I. -I/opt/aCC/include -g +W 829
mytest: main.o
$(CC) -o mytest main.o
main.o: main.cpp plugin.sl
$(CC) -c main.cpp $(CFLAGS) -ldl
plugin.sl: plugin.o
$(CC) -b -o plugin.sl plugin.o $(CFLAGS)
plugin.o: plugin.cpp
$(CC) +z -c plugin.cpp $(CFLAGS) |
Et pour finir voici le résultat de l'éxécution de mon programme :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| ./mytest
date : toto
message : pouet
//////////////////////
date : toto
:
:
:
:
:
Break car boucle infinie...
//////////////////////
date : toto
message : pouet |