Créer une DLL à partir de C ++ non géré

J’ai actuellement une application console écrite en C ++ non géré, le code source consiste en une entrée main et quelques autres fonctions. Je dois créer une DLL à partir de ce code afin de pouvoir l’utiliser à partir d’autres projets, en particulier à partir de C ++ géré. (Autre question: est-ce que je devrais écrire une classe wrapper à cette fin?)

Comme je ne connais quasiment rien du C ++ géré / non géré et de la création de DLL, j’ai suivi ce tutoriel et réussi à mettre en place une DLL simple Hello World en utilisant uniquement VS2010 (pas de CMake).

Cependant, mon projet a beaucoup de dépendances (par exemple, la bibliothèque de nuages ​​de points ) et j’utilise donc normalement CMake pour générer la solution Visual Studio 2010 qui est ensuite intégrée à un exécutable, comme décrit dans le didacticiel PCL . Comment puis-je utiliser CMake pour construire un projet VS2010 qui sera intégré à une DLL?

Pour résumer mon problème:

  1. J’ai un projet de code C ++ non géré qui nécessite beaucoup de dépendances.
  2. Je veux créer une DLL à partir de ce code qui peut être appelée à partir de C ++ géré.

Informations supplémentaires: Windows 7, Visual Studio 2010 Ultimate, CMake 2.8.10.2

EDIT: J’ai utilisé CMake avec votre ligne a changé, et cela a fonctionné comme prévu. C’est ce que j’ai ajouté depuis dans mon fichier d’entête. Suis-je sur la bonne voie?

MyCode.h

 #ifdef MyLib_EXPORTS #define API_DECL __declspec( dllexport ) #else #define API_DECL __declspec( dllimport ) #include  #include  etc... API_DECL void myFirstFunction(); API_DECL void mySecondFunction(); #endif 

MyCode.cpp: Je n’ai apporté aucune modification au fichier source, dois-je en apporter?

Malheureusement, je ne peux pas vous aider avec la partie de code managé, mais voici comment créer une DLL dans CMake:

Tout d’abord, au lieu d’utiliser

 `ADD_EXECUTABLE( YourLib SHARED yourclass.cpp yourclass.h )` 

dans votre CMakeLists.txt , utilisez

 `ADD_LIBRARY( YourLib SHARED yourclass.cpp yourclass.h )` 

Cela configurera la solution pour créer une DLL plutôt qu’un exécutable.

Toutefois, pour pouvoir utiliser cette DLL avec vos projets, vous devez exporter les symboles que vous souhaitez utiliser. Pour ce faire, vous devez append __declspec( dllexport ) à vos déclarations de classe et / ou de fonction. La construction de la bibliothèque donnera alors deux fichiers, a. dll et un .lib . La dernière est la bibliothèque dite d’importation dont vous avez besoin lorsque vous souhaitez utiliser cette bibliothèque dans vos autres projets. Le .dll sera requirejs au moment de l’exécution.

Cependant : lorsque vous souhaitez utiliser votre bibliothèque, vous devez utiliser __declspec( dllimport) (plutôt que dllexport ). Pour éviter d’utiliser deux fichiers d’en-tête, la méthode habituelle consiste à utiliser le préprocesseur. CMake vous aide réellement en fournissant une define YourLibrary_EXPORTS dans votre projet de bibliothèque.

Résumer:

 #ifndef YOUR_CLASS_H #define YOUR_CLASS_H #ifdef YourLib_EXPORTS #define API_DECL __declspec( dllexport ) #else #define API_DECL __declspec( dllimport ) #endif class APIDECL YourClass { void foo(); void bar(); }; #endif // YOUR_CLASS_H 

EDIT: Si vous voulez pouvoir utiliser ces fonctions à partir de C (et les langages pouvant utiliser ces fonctions), vous devez envelopper vos déclarations avec extern "C" {

 extern "C" { API_DECL void myFirstFunction(); API_DECL void mySecondFunction(); }