2012-01-16 4 views
0

Je veux écrire un dll pour un API d'un périphérique. depuis que je suis nouveau à dlls je voulais l'implémenter sur un éditeur de texte simple, puis en faire un pour l'API. J'ai fait un fichier d'en-tête et un fichier cpp mais quand j'exécute le code, j'obtiens l'erreur lnk2001 suivie par lnk1120 qui est une erreur externe non résolue.Erreur de lien DLL C++

Je n'ai vraiment aucune idée d'où j'ai fait une erreur, pour autant que je vois que je l'ai fait dans le bon sens. Je me demandais si vous pouviez m'aider. tnx.

ici est mon fichier d'en-tête

// EditFuncsDll.h 
#include <cstdio> 
#include <vector> 
#include <string> 

namespace EditFuncs 
{ 
    class MyEditFuncs 
{ 
private: 
    static std::vector<std::string> MyTextBox; 

public: 
    static __declspec(dllexport) void Load(std::string command); 
    static __declspec(dllexport) void Save(std::string command); 
    static __declspec(dllexport) int Lines(); 
    static __declspec(dllexport) void Add(std::string command); 
    static __declspec(dllexport) void Remove(std::string command); 
    static __declspec(dllexport) void Insert(std::string command); 
    static __declspec(dllexport) int wc(std::string command); 
    static __declspec(dllexport) void GetInfo(); 
}; 
} 

et dans mon fichier cpp i définir simplement les fonctions i dans le fichier Déclaré en-tête.

et ce sont les erreurs que je reçois

Erreur 25 erreur LNK2001: symbole externe non résolu « private: static class std :: vecteur, classe std :: allocateur>, classe std :: allocateur, classe std :: allocateur>>> EditFuncs :: MyEditFuncs :: MyTextBox "(? MyTextBox @ MyEditFuncs @ ModifierFuncs @@ 0V? $ vector @ V? $ basic_string @ DU? $ char_traits @ D @ std @@ V? $ allocateur @ D @ 2 @@ std @@ V? $ Allocateur @ V? $ Basic_string @ DU? $ Char_traits @ D @ std @@ V? $ Allocateur @ D @ 2 @@ std @@@ 2 @@ std @@ A) C: \ Users \ Lucy \ Desktop \ Erfan \ Text_Editor_DLL \ Text_Editor_DLL \ EditFuncsDll.obj Text_Editor_DLL

et

Erreur 26: erreur LNK1120 1 externals non résolues C: \ Users \ Lucy \ Desktop \ Erfan \ Text_Editor_DLL \ Debug \ Text_Editor_DLL.dll Text_Editor_DLL

+0

@Assem mais je suis juste en train de définir les fonctions dans le fichier cpp c'est la cpp fichier de l'en-tête pas le cpp principal. Je ne pense pas que je devrais le définir là. devrais-je? – Erfan

+0

vous devez définir chaque variable de membre statique déclarée dans le cpp correspondant. Il suffit de l'écrire avant la définition de vos fonctions dans le fichier .cpp. BTW, je devrais corriger ce que j'ai écrit dans le commentaire précédent: std :: vector EditFuncs :: MyEditFuncs :: MyTextBox; – Assem

+0

@Assem voici une partie de mon cpp '// EditFuncsDll.cpp #include "EditFuncsDll.h » #include #include using namespace std; EditFuncs d'espace de noms { \t std :: statique vecteur MyTextBox; \t MyEditFuncs vide :: Load (chaîne de commande) \t { \t \t chaîne nom de fichier; \t \t // Le nom du fichier commence au cinquième caractère de la commande et va à la fin \t \t fichier name = command.substr (5, command.size()); \t \t ifstream inFile; \t \t inFichier.open (nomfichier); ' donc en fonction de ce que vous avez dit j'ai ajouté la définition de cette variable statique, mais j'ai toujours la même erreur. Je ne sais pas pourquoi! – Erfan

Répondre

1

La tête de votre cpp devrait ressembler à ceci:

#include "EditFuncsDll.h" 
#include <iostream> 
#include <fstream> 
using namespace std; 
namespace EditFuncs 
{ 
    std::vector<std::string> EditFuncs::MyEditFuncs::MyTextBox; 
    void MyEditFuncs::Load(string command) 
    { 
     string filename; // The name of the file starts at the fifth character of the command and goes to the end 
     filename = command.substr(5,command.size()); 
     ifstream inFile; 
     inFile.open(filename); 
     . 
     . 
     . 
+0

OMG son travail: D merci. Donc, chaque fois que je définis un membre statique, je devrais le définir dans le cpp correspondant. droite? Merci encore. – Erfan

+0

C'est ça @Erfan :) – Assem

0

Dans votre fichier d'en-tête de DLL, vous pouvez utiliser une macro préprocesseur, qui se développe à __declspec(dllimport) pour les clients de DLL, et __declspec(dllexport) pour le code qui implémente la DLL (à savoir vos fichiers DLL .cpp).

// EditFuncsDll.h 

#ifdef EDIT_FUNCS_DLL_IMPLEMENTATION 
#define EDIT_FUNCS_DLL __declspec(dllexport) // for DLL implementation 
#else 
#define EDIT_FUNCS_DLL __declspec(dllimport) // for clients 
#endif 

class EDIT_FUNCS_DLL MyEditFuncs 
{ 
... 
}; 

Dans votre fichier .cpp source de DLL (s), vous pouvez #define EDIT_FUNCS_DLL_IMPLEMENTATION avant #including votre tête DLL:

// EditFuncsDll.cpp 

#define EDIT_FUNCS_DLL_IMPLEMENTATION 
#include "EditFuncsDll.h" 

// ... implementation code 
+0

Merci, en fait je ne suis pas sûr, ce que fait exactement dllimport. J'ai utilisé msdn comme mon tutoriel pour dll, et parfois on ne sait pas pourquoi et quand devrais-je l'utiliser. Je suis à la recherche d'un bon tutoriel sur dll mais je ne l'ai pas trouvé. et en passant, le code construit avec succès maintenant mais quand je l'exécute, comme les fonctions de la DLL retourner, le programme se bloque et je ne comprends pas pourquoi ??? !!! Peut-il provenir de ces macros de préprocesseur? – Erfan

+0

@ Erfan: Je suggérerais ces articles de CodeProject: [Tutor DLL régulière pour les débutants] (http://www.codeproject.com/Articles/6351/Regular-DLL-Tutor-For-Beginners) et [HowTo: Export Classes C++ à partir d'une DLL] (http://www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLL). Les causes des plantages peuvent être différentes ... vous pouvez donner plus de détails (par exemple, construisez-vous à la fois l'EXE et la DLL avec le même compilateur VC++ et la même saveur CRT?). –

+0

Oui, j'utilise VS2011 pour créer la DLL et le fichier .exe. Je fais une API pour un appareil. Merci beaucoup pour les liens, je ne pouvais pas trouver de tutoriels intéressants. Il était soit trop vieux ou juste une DLL Hello World. – Erfan