Salut,
Les fonctions (et les classes) qui doivent etre exportées depuis une dll doivent etre déclarées avecl le fameux declspec("dllexport") lors de la compilation.
D'autre part, pour éviter le recours au fichier def lors de l'utilisation, les classes et fonctions importées d'une dll externe doivent être déclarées avec le tout aussi fameux declspec("dllimport").
Le plus facile pour t'assurer que les bonnes fonctions et classe seront effectivement correctement exportées (respectivement importées lors de l'utilisation) est donc de recourir au préprocesseur de manière à les déclarer avec la bonne spécification.
L'exemple minimal serait proche de
1 2 3 4 5
| #ifdef BUILD_MYDLL
#define MY_DLL_INTERFACE declspecs("dllexport")
#else
#define MY_DLL_INTERFACE declspecs("dllimport")
#endif |
où MY_DLL_INTERFACE et BUILD_MYDLL seraient des symboles à exclusivement utilisés dans la dll que tu veux créer et où
BUILD_MYDLL serait en outre passé en paramètre lors de la compilation (la ligne de commande de gcc ressemblerait donc à
gcc -DBUILD_MYDLL //la suite
)
La déclaration d'une classe devant être intégralement exportée ressemblerait alors à
1 2 3 4
| class MY_DLL_INTERFACE MyClass
{
// son contenu
}; |
Le fait d'avoir forcé l'exportation de la classe permettra à l'outil de création de fichiers def de retrouver l'ensemble des fonctions membres dont ta classe est composée et qui doivent être exportées
NOTA: si les DLL en C++ sont une manière géniale de fournir des plugins à des applications, il faut garder en tête le fait que, contrairement aux DLL's écrites (et compilées) en C, une DLL écrite (et compilée) en C++ ne sera utilisable que par une application C++ ayant été compilée avec la même version du même compilateur et en utilisant les mêmes options que la dll, car l'ABI relative aux dll n'est pas standardisée
Partager