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
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
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
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
 
#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
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
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:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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!