Bonsoir, après avoir lu le tutorial http://hiko-seijuro.developpez.com/a...que-dynamique/ sur la création de librairie dynamique en c++ sous linux et testé son exemple, je m'interroge sur la manière d'instancier un objet dans le code de la librairie
mettons la classe "circle" (issue du tuto):
j'ai voulu ajouter une autre classe "test" :
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 circle.h #ifndef CIRCLE_H_ #define CIRCLE_H_ #include <iostream> class circle { public: virtual void draw(); }; typedef circle *(*maker_circle)(); #endif circle.cpp #include "circle.h" using namespace std; void circle::draw() { cout << " ### " << endl; cout << " # # " << endl; cout << " # # " << endl; cout << " # # " << endl; cout << " # # " << endl; cout << " ### " << endl; } extern "C" { circle *make_circle() { return new circle(); } }
j'ai voulu l'instancier dans la méthode "draw" de "circle"
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 test.h #ifndef TEST_H_ #define TEST_H_ #include <iostream> class test { public: Test(); ~Test(); void print(); }; #endif test.cpp #include "test.h" using namespace std; Test::Test(){} Test::~Test(){} void Test::print(){ cout << " TEST " << endl; }
voici le main.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 void circle::draw() { cout << " ### " << endl; cout << " # # " << endl; cout << " # # " << endl; cout << " # # " << endl; cout << " # # " << endl; cout << " ### " << endl; Test* test = new Test(); test->print(); }
je compile en librairie dynamique sans problème avec
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 #include "circle.h" #include "test.h" #include <cstdlib> #include <iostream> #include <dlfcn.h> using namespace std; int main(int argc, char **argv) { void *hndl; maker_circle pMaker; // Ouverture de la librairie hndl = dlopen("./libcircle.so", RTLD_LAZY); if(hndl == NULL) { cerr << "dlopen : " << dlerror() << endl; exit(EXIT_FAILURE); } // Chargement du créateur void *mkr = dlsym(hndl, "make_circle"); if (mkr == NULL) { cerr << "dlsym : " << dlerror() << endl; exit(EXIT_FAILURE); } pMaker = (maker_circle)mkr; // Création, affichage puis destruction du cercle circle *my_circle = pMaker(); my_circle->draw(); dlclose(hndl); return EXIT_SUCCESS; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 libcircle.so: circle.cpp circle.h test.h test.cpp g++ -shared -o libcircle.so circle.cpp example: main.cpp libcircle.so g++ -o example main.cpp -ldl
mais à l'exécution, j'obtiens un "undefined symbol: _ZN4TestC1Ev"
ai-je mal instancié ?
Partager