Bonsoir,
j'ai un gros souci avec ma lib_Qt.so, je m'en remets donc a vous car je n'arrive pas a resoudre ce probleme.
Mon projet consiste a coder un Snake compatible avec 3 bibliotheques graphiques differentes (SDL, minilibX, Qt). Les libs graphiques se contentent uniquement de l'affichage. Pour ce faire, j'utilise dlopen, dlsym et dlclose afin d'avoir un code uniforme et generique. Je donne a mon executable une largeur, une hauteur (pour la map) et la bibliotheque desiree (SDL, minilibX ou Qt). Exemple : ./nibbler 50 50 lib_Qt.so
Voici a quoi ressemble mon main, afin de vous faire comprendre le pourquoi du comment :
La partie SDL est finie ainsi que la minilibX (excepte quelques bugs sans rapport avec cette discussion). Il n'y a que la partie Qt qui me bloque.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 int main(int argc, char **argv) { if ((check_args(argc, argv)) == -1) return 1; ILib* (*external_creator)(int, int, int, char **); void *dlhandle; Nibbler nib(atoi(argv[1]), atoi(argv[2])); int stop = 0; srand(time(NULL)); dlhandle = dlopen(argv[3], RTLD_LAZY); if (dlhandle == NULL) { std::cerr << "ERROR : " << argv[3] << " is not existing or is not support." << std::endl; std::cerr << dlerror() << std::endl; return 1; } external_creator = reinterpret_cast<ILib* (*)(int, int, int, char **)>(dlsym(dlhandle, "create_lib")); if (external_creator == NULL) return 1; ILib *lib = external_creator(atoi(argv[1]), atoi(argv[2]), argc, argv); while (stop != -1 && stop != -2) { nib.pop_food(); nib.eat(); lib->Do_Event(); if (lib->getKey() == 1) stop = nib.move("a"); else if (lib->getKey() == 2) stop = nib.move("d"); else if (lib->getKey() == -1) stop = -2; lib->Display_Snake(nib.getBody()); lib->Display_Food(nib.getFood()); if ((lib->Handle_Time()) == 1) stop = nib.move("avance"); lib->setKey(3); } if (stop == -1) std::cout << "Perdu !" << std::endl; else if (stop == -2) std::cout << "T'abandonnes ? Tafiole !" << std::endl; delete lib; dlclose(dlhandle); return 0;
Lorsque j'essaie d'ouvrir ma lib_Qt.so, dlopen fail et dlerror m'indique ce message :
undefined symbol: _ZNK5QtLib6getKeyEv
On peut remarquer getKeyEv dans l'erreur. getKey est un getter qui me permet de savoir si la touche appuyee est la touche droite, gauche, etc. En fonction de la touche pressee, je set un nombre (avec setKey(int)) puis le recupere avec le getter dans le main afin de tourner dans la bonne direction.
Je suppose que ce probleme vient du Makefile, pendant le linkage. Je n'arrive pas a trouver la solution. Voici en piece jointes le Makefile qui cree ma lib_Qt.so et le Qt.pro. A savoir que j'utilise des fonctions surchargees pour Qt (keyPressEvent et paintEvent).
Il doit surement manquer un flag, mais le Makefile genere est tellement fouilli que j'ai du mal a m'y retrouver...
Je vous remercie pour vos eclairages. N'hesitez pas a me poser des questions si ce n'est pas clair !
P.S : desole pour les accents, je suis sur un qwerty et je n'ai pas trop le temps (je dois rendre mon projet dimanche).
Partager