Bonjour,
Je développe actuellement une librairie open source/multi-plateforme, et je suis un peu embêté, car je voudrais pouvoir offrir à l'utilisateur (développeur) le choix de la lier dynamiquement ou statiquement à ses programmes.
Même si le projet n'existe pour l'instant que sous forme de diagramme UML, je préfère me poser la question dès maintenant pour pas être bloqué plus tard.
Mon problème se pose au niveau des macros pour indiquer au compilateur que mes classes doivent être utilisées dans une .dll (ou .so). Pour cela je passerai un Flag au pré-processeur (avec -DDYNAMIC pour gcc par exemple).
En outre j'ai également fouillé dans les headers de Qt (que j'avais sous la main) et je suis tombé sur ce code ci:
Ce qui donnerait quelque chose comme ceci:
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 #ifndef Q_DECL_EXPORT # ifdef OS_WIN # define Q_DECL_EXPORT __declspec(dllexport) # elif defined(QT_VISIBILITY_AVAILABLE) # define Q_DECL_EXPORT __attribute__((visibility("default"))) # endif # ifndef Q_DECL_EXPORT # define Q_DECL_EXPORT # endif #endif #ifndef Q_DECL_IMPORT # if defined(Q_OS_WIN) # define Q_DECL_IMPORT __declspec(dllimport) # else # define Q_DECL_IMPORT # endif #endif
Où OS_WIN sera défini à certaines conditions (C-A-D si la plateforme cible est de type windows 16, 32, 64, embarqué...)
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 #ifndef DECL_EXPORT # ifdef OS_WIN # define DECL_EXPORT __declspec(dllexport) # ifndef Q_DECL_EXPORT # define Q_DECL_EXPORT # endif #endif #ifndef DECL_IMPORT # if defined(OS_WIN) # define DECL_IMPORT __declspec(dllimport) # else # define DECL_IMPORT # endif #endif
Puis, selon que l'on veuille compiler ou utiliser ma librarie ou l'utiliser dans un projet, j'ajouterai ce morceau de code ci (ce que fait QtCreator en fait):
Enfin les déclaration de mes classes se feraient de cette manière:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 #ifndef BUILD_LIB # LIB_DECL = DECL_EXPORT #else # LIB_DECL = DECL_IMPORT #endif
Ceci est il suffisant? Que me conseilleriez vous? Avez vous des liens vers des Tutos à me suggérer (j'ai lu celui-ci mais je ne pense pas qu'il réponde à mon problème)? Des snippets à me proposer?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 class LIB_DECL Toto { ... };
Je vous remercie par avance.
Partager