.so/.dll .a/.lib et dllexport
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:
Code:
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 |
Ce qui donnerait quelque chose comme ceci:
Code:
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 |
Où OS_WIN sera défini à certaines conditions (C-A-D si la plateforme cible est de type windows 16, 32, 64, embarqué...)
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):
Code:
1 2 3 4 5
| #ifndef BUILD_LIB
# LIB_DECL = DECL_EXPORT
#else
# LIB_DECL = DECL_IMPORT
#endif |
Enfin les déclaration de mes classes se feraient de cette manière:
Code:
1 2 3 4
| class LIB_DECL Toto
{
...
}; |
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?
Je vous remercie par avance.