J'ai un problème avec les variables globales dans un projet de bibliothèque partagée C++. ma bibliothèque doit fonctionner comme une bibliothèque partagée g ++ standard (.so) ainsi qu'une DLL. Je l'ai fait en créant des fichiers libiup_dll.cpp et libiup_dll.h, où j'ai quelque chose commeProblèmes avec les variables globales dans le projet de bibliothèque partagée (C++)
#ifdef BUILD_DLL
// code for the dll: wrapper functions around the classes in my shared library
#endif
dans mon dll, j'ai besoin des fonctions setLogLevel (int) et geterrormsg(). dans toutes mes classes, j'ajouterais alors à une variable globale errormsg tous les messages d'erreur. cette variable devrait ensuite être retournée par la fonction geterrormsg(). i mis en œuvre en utilisant ce
std::string errormsg;
int loglevel;
à libiup_dll.h (extérieur et #ifdefs, il devrait donc être disponible au niveau mondial), puis mettre
extern std::string errormsg;
extern int loglevel;
dans les fichiers .h de mes classes (en dehors de la classe, en haut des fichiers)
maintenant j'ai deux problèmes:
1) lors de la compilation d'un programme de ligne de commande avec g ++, qui utilise ma bibliothèque, je reçois des erreurs
cible de construction: libiup_test Invoquer: GCC C++ Linker g ++ -L "/ home/hilboll/src/libiup/Release" -L/usr/-o local/lib "libiup_test" ./src/stratcalc /SimpleStratosphericColumnCalculatorTest.o ./src/interp/SimpleInterpolatorTest.o ./src/Test.o -lgsl -lhdf5 -lhdf5_cpp -lblas -liup /home/hilboll/src/libiup/Release/libiup.so: non définie référence à
loglevel' /home/hilboll/src/libiup/Release/libiup.so: undefined reference to
errormsg » collect2: ld retourné 1 état de sortie make: *** [libiup_test] erreur 1
même si dans mon programme de ligne de commande, il n'y a aucune référence à errormsg ou loglevel.
2) en essayant de compiler les dll sous Windows avec VS2008, je reçois
z: \ src \ vs \ libiup_dll \ libiup_dll.h (229) : erreur C2086: « std :: string errormsg ': Neudefinition z: \ src \ libiup \ src \ ../ stratcalc interp/SimpleInterpolator.h (16): Siehe Deklaration von 'errormsg' z: \ src \ vs \ libiup_dll \ libiup_dll.h (234 : erreur C2086: 'int loglevel': Neudéfinition z: \ src \ libiup \ src \ stratcalc ../ interp/SimpleInterpolator.h (17): Deklaration von 'loglevel'
autant que je comprenne, cela signifie que VS pense que je définis deux fois les deux variables. Cependant, dans SimpleInterpolator.h 16/17, il n'y a que les déclarations extern ...
il semble que je n'ai pas encore compris comment fonctionnent les variables globales, pour le moment. Toute aide est grandement appréciée!
en utilisant un compilateur qui parle anglais pourrait être un bon début. – shoosh
montrant la source réelle plutôt que de la décrire serait bien. –