symbole externe non résolu pour declspec (dllimport) en utilisant dll pour exporter la classe

je veux créer une classe dérivée basée sur une classe dll exportée. La classe de base est définie dans le projet A, et la classe dérivée est dans le projet B.--7--> <!-Tout d'abord, dans le projet A, le préprocesseur MYDLL_BUILD est défini. Et j'utilise un fichier d'en-tête pour spécifier l'exportation/importation:

    #if !defined(MYDLL_BUILD)
    #   pragma comment(lib, "myDll.lib")
    #endif

    #if defined(MYDLL_BUILD)
    #   define MYDLL_API __declspec(dllexport)
    #else
    #   define MYDLL_API __declspec(dllimport)
    #endif

Puis-je définir la classe de base:

class MYDLL_API DllObject
{
public:
    virtual ~DllObject() {}
protected:
    DllObject() { m_count = 3; }
private:
    int m_count;
};

dans le projet B, le préprocesseur MYDLL_BUILD n'est pas défini. Voici la classe dérivée:

class MyClass : public DllObject
{
public:
    ~MyClass(){}
    MyClass() { m_data = 20; }
private:
    int m_data;
}; 

j'ai inclus le fichier dll et lib, mais j'obtiens quand même l'erreur de symbole externe non résolue:

2>Test_Entry.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual __thiscall ADAI::DllObject::~DllObject(void)" (__imp_??1DllObject@ADAI@@UAE@XZ) referenced in function "public: virtual __thiscall MyClass::~MyClass(void)" (??1MyClass@@UAE@XZ)
2>Test_Entry.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) protected: __thiscall ADAI::DllObject::DllObject(void)" (__imp_??0DllObject@ADAI@@IAE@XZ) referenced in function "public: __thiscall MyClass::MyClass(void)" (??0MyClass@@QAE@XZ)
2>c:UsersAdaiDocumentsVisual Studio 2010ProjectsTest_MainDebugTest_Main.exe : fatal error LNK1120: 2 unresolved externals

j'ai cherché en ligne, la plupart des réponses affirment que la lib est manquant. Mais ces instructions ne résolvent pas mon problème.

quand je change

    class MYDLL_API DllObject

    class __declspec(dllexport) DllObject 

La solution se compile sans erreur. Je ne comprends vraiment pas la raison. Quelqu'un peut-il aider s'il vous plaît? Merci à l'avance.

14
demandé sur Liviu 2012-03-17 08:19:38

1 réponses

La raison en est inline.

cela complique la création dll parce que vous avez besoin d'exporter exactement une copie mais le compilateur ne sait pas quelle copie est la d'un droit. Dans ce cas, en ajoutant du code à DllObject.rpc, vous avez fait le compilateur émettent code pour DllObject et linker avait une copie de DllObject::~DllObject exporter.

Je ne peux pas vous donner d'explication plus détaillée de votre cas particulier parce que je ne connais pas la source complète et les options de compilation pour votre projet.

6
répondu Tomek Szpakowicz 2012-03-19 08:07:27