Bonjour! Je souhaite instancier une classe contenue dans une DLL.
Le projet dll contient les fichiers dll.h et dllmain.cpp, le projet de "test" lui comporte juste exemain.cpp, voici leur contenu:
dll.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
#ifndef DLL
#define DLL
#include <string>
#include <iostream>
#include <windows.h>
class perso
{
private:
string name;
public:
string getName();
void setName(string pname);
};
#endif |
dllmain.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
#include "dll.h"
void perso::setName(string pname)
{
name = pname;
}
string perso::getName()
{
return name;
}
extern "C" __declspec(dllexport) perso* crtPerso()
{
return new perso();
} |
exemain.cpp
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
|
#include <string>
#include <iostream>
#include <windows.h>
using namespace std;
class perso
{
private:
string name;
public:
string getName();
void setName(string pname);
};
int main()
{
HMODULE hMod = LoadLibrary("dll.dll");
typedef perso* (*pcrtPerso)();
pcrtPerso crtPerso = (pcrtPerso)GetProcAddress(hMod, "crtPerso");
perso* hercule = crtPerso();
hercule->setName("Hercule");
} |
Voici mon problème: lors de la compilation, la dll se charge correctement, l'import de la fonction aussi, et la création d'une nouvelle instance également, cependant la dernière ligne qui appelle la méthode setName semble poser problème puisqu'elle génère l'erreur suivante:
Erreur 1 error LNK2001: symbole externe non résolu "public: void __thiscall perso::setName(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?setName@perso@@QAEXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) exemain.obj test
Après recherche sur le net il semblerait qu'il faut créer un .lib et la linker au projet test, ce que j'ai effectué, mais une autre erreur est survenue: les méthodes de la classe semblaient déjà être déclarées. Le compilateur m'indiquait un conflit avec la bibliothèque par défaut et qu'il fallait utiliser l'option: /NODEFAULTLIB:library:
Avertissement 6 warning LNK4098: conflit entre la bibliothèque par défaut 'MSVCRTD' et les autres bibliothèques*; utilisez /NODEFAULTLIB:library test test
Ce que j'ai effectué, mais cela m'a généré encore plus d'erreurs (env 60), là je ne sais plus où chercher.
Mes connaissances en C++, POO et création de DLL sont limitées, j'ai réalisé ce projet de test avec beaucoup de tutoriels, je dois certainement mal utiliser les exports et mal concevoir ma DLL.
Merci d'avance pour votre aide!
Partager