2011-04-14 3 views
2

Je n'arrive pas à comprendre où il y a une erreur. Je crée une DLL et ensuite l'utilise dans un programme de console C++ (Windows 7, VS2008). Mais je reçois LNK2019 unresolved external symbol en essayant d'utiliser les fonctions DLL.C++ exporter et utiliser la fonction dll

d'abord l'exportation:

#ifndef __MyFuncWin32Header_h 
#define __MyFuncWin32Header_h 

#ifdef MyFuncLib_EXPORTS 
# define MyFuncLib_EXPORT __declspec(dllexport) 
# else 
# define MyFuncLib_EXPORT __declspec(dllimport) 
# endif 

#endif 

Ceci est un fichier d'en-tête que je puis utiliser dans:

#ifndef __cfd_MyFuncLibInterface_h__ 
#define __cfd_MyFuncLibInterface_h__ 

#include "MyFuncWin32Header.h" 

#include ... //some other imports here 

class MyFuncLib_EXPORT MyFuncLibInterface { 

public: 

MyFuncLibInterface(); 
~MyFuncLibInterface(); 

void myFunc(std::string param); 

}; 

#endif 

Ensuite, il y a le dllimport dans le programme de la console, qui a la DLL inclus dans le Linker -> Général-> Répertoires de bibliothèques supplémentaires:

#include <stdio.h> 
#include <stdlib.h> 
#include <iostream> 


__declspec(dllimport) void myFunc(std::string param); 


int main(int argc, const char* argv[]) 
{ 
    std::string inputPar = "bla"; 
    myFunc(inputPar); //this line produces the linker error 
} 

Je ne peux pas comprendre ce qui ne va pas lui e; ça doit être quelque chose de vraiment simple et fondamental.

Répondre

10

Vous exportez une fonction de membre de la classe void MyFuncLibInterface::myFunc(std::string param); mais en essayant d'importer une fonction sans void myFunc(std::string param);

Assurez-vous #define MyFuncLib_EXPORTS dans le projet de DLL. Assurez-vous que vous #include "MyFuncLibInterface.h" dans l'application de la console sans définissant MyFuncLib_EXPORTS.

Le projet DLL verra:

class __declspec(dllexport) MyFuncLibInterface { 
... 
}: 

Et le projet de la console verra:

class __declspec(dllimport) MyFuncLibInterface { 
... 
}: 

Cela permet à votre projet de console d'utiliser la classe de la dll.

EDIT: En réponse au commentaire

#ifndef FooH 
#define FooH 

#ifdef BUILDING_THE_DLL 
#define EXPORTED __declspec(dllexport) 
#else 
#define EXPORTED __declspec(dllimport) 
#endif 

class EXPORTED Foo { 
public: 
    void bar(); 
}; 


#endif 

Dans le projet qui met effectivement en œuvre Foo::bar()BUILDING_THE_DLL doit être défini. Dans le projet qui essaie de utiliserFoo, BUILDING_THE_DLL devrait pas être défini. Les deux projets doivent#include "Foo.h", mais seul le projet DLL doit contenir "Foo.cpp"

Lorsque vous créez ensuite la DLL, la classe Foo et tous ses membres sont marqués comme « exportés de cette DLL ». Lorsque vous générez un autre projet, la classe Foo et tous ses membres sont marqués comme "importés d'une DLL"

+0

Bonne réponse; essentiellement ce que j'ai remarqué. De plus, la fonction n'est pas déclarée statique, vous avez donc besoin d'une instance de la classe pour appeler la fonction. –

+0

Je ne comprends pas assez les answear. Est-ce que je suis supposé enlever l'Interface.h des #imports et le définir et l'inclure avec le projet de console? Pouvez-vous être un peu plus précis. –

+0

@ inf.ig.sh: Si vous voulez utiliser la classe à partir du projet console, vous devez inclure le .h dans le projet console. Le projet console doit voir la classe déclarée comme * dllimport * afin qu'il recherche l'implémentation réelle dans une DLL. – Erik

1

Vous devez importer la classe n'est pas une fonction. Après cela, vous pouvez appeler le membre de la classe.

class __declspec(dllimport) MyFuncLibInterface { 

public: 

MyFuncLibInterface(); 
~MyFuncLibInterface(); 

void myFunc(std::string param); 

}; 

int main(int argc, const char* argv[]) 
{ 
std::string inputPar = "bla"; 
MyFuncLibInterface intf; 
intf.myFunc(inputPar); //this line produces the linker error 
} 
Questions connexes