simbolo esterno non risolto per __declspec(dllimport) quando si utilizza dll per esportare la classe

Voglio definire una classe derivata basata su una dll di classe esportata. La classe base è definito in Un Progetto, e la classe derivata è in Progetto B.

In primo luogo, nel Progetto, il preprocessore MYDLL_BUILD è definito. E io uso un file di intestazione per specificare di esportazione/importazione:

    #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

Quindi definire la classe di base:

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

In Progetto B, il preprocessore MYDLL_BUILD non è definito. Qui è la classe derivata:

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

Ho inserito la dll e file di libreria, ma ancora ottenere il simbolo esterno non risolto errore:

2>Test_Entry.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual __thiscall ADAI::DllObject::~DllObject(void)" (__imp_??[email protected]@@[email protected]) referenced in function "public: virtual __thiscall MyClass::~MyClass(void)" (??1MyClass@@[email protected])
2>Test_Entry.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) protected: __thiscall ADAI::DllObject::DllObject(void)" (__imp_??[email protected]@@[email protected]) referenced in function "public: __thiscall MyClass::MyClass(void)" (??0MyClass@@[email protected])
2>c:\Users\Adai\Documents\Visual Studio 2010\Projects\Test_Main\Debug\Test_Main.exe : fatal error LNK1120: 2 unresolved externals

Ho cercato su internet, la maggior parte delle risposte sostengono che la lib è mancante. Ma le istruzioni non risolvere il mio problema.

Quando cambio

    class MYDLL_API DllObject

per

    class __declspec(dllexport) DllObject 

La soluzione compila senza errori. Io davvero non capisco il motivo. Qualcuno può per favore aiutarmi? Grazie in anticipo.

  • Sembra MYDLL_API non è definito in Un Progetto come ci si aspetta che. Ottenere VS generare un pre-elaborato versione del file che DllObject è definita in (clic destro sul file, selezionare proprietà, espandere il C/C++ e guardare in opzioni per il preprocessore). Assicurarsi che l’output contiene class __declspec(dllexport) DllObject e non class __declspec(dllimport) DllObject
  • Tali errori del linker non può essere generato per il frammento di codice che hai postato. Hai scritto il codice nel file di intestazione. Così, quando è #include, non c’è alcuna dipendenza con la DLL .lib. In caso non stiamo guardando il codice vero e proprio, semplicemente suona come voi, in qualche modo, non #define MYDLL_BUILD correttamente.
  • Grazie per la risposta. Il DllObject è solo un file di intestazione, non c’è nessun file cpp. Non riesco a generare un file pre-elaborato per DllObject. Il preprocessore MYDLL_BUILD è definito nelle proprietà di Progetto A. I codici che ho incollato sopra sono veri e propri codici, ma è solo una parte penso relative al messaggio di errore.
  • Aggiornamento: ho aggiunto DllObject.cpp per generare il file pre-elaborato. L’output contiene la classe __declspec(dllexport) DllObject. Tuttavia, gli errori sono sempre gli stessi. Non mi manca qualcosa?
  • Aggiornamento: ho aggiunto una funzione in DllObject.h e implementare in DllObject.cpp. Nient’altro è stato cambiato, e le impostazioni sono le stesse, come pure. Poi si compila correttamente. // DllObject.h MYDLL_API int foo(int n); classe MYDLL_API DllObject { public: virtual ~DllObject() {} protected: DllObject() { m_count = 3; } private: int m_count; }; // DllObject.cpp int foo(int n) { return 0; }
  • Io sto affrontando lo stesso problema e colpire la mia tastiera non capire perché sta succedendo 🙁
  • Anche a Me, fondamentalmente, molto leggera differenza nella decorazione. (Anche se per me è tirare i capelli più di tastiera colpire)
  • Ero troppo. Nel mio caso, è stato causato dalla DLL in fase di compilazione con il UNICODE macro, ma non i file eseguibili che sono state collegamento con esso.
  • Ho appena avuto lo stesso problema: il progetto che ha definito la classe originale è stato, infatti, … non costruito. È uno dei tanti progetti che ho raramente cambiano, in modo che è stato scaricato. Non sono riuscito a fare la connessione per qualche tempo perché la funzione è in linea.

InformationsquelleAutor Chtoucas | 2012-03-17



One Reply
  1. 6

    Il motivo è inline.

    In breve, per rendere le funzioni inline possibile C++ deve consentire la definizione di funzione di essere inclusi e compilato in più unità di compilazione (fondamentalmente .i file cpp) senza causare errori. Compilatore può, ma non deve generare codice per qualsiasi di queste definizioni. Quindi linker è consentito scelto una copia.

    Questo complica dll creazione, perché avete bisogno di esportare esattamente una copia, ma il compilatore non sa che la copia è quella giusta. In questo caso, aggiungendo un po ‘ di codice per DllObject.cpp hai fatto il compilatore di generare codice per DllObject e linker avuto qualche copia di DllObject::~DllObject per l’esportazione.

    Io non posso darti spiegazioni più dettagliate del vostro caso particolare, perché non so piena di origine e di opzioni di compilazione per il vostro progetto.

    • In cui .h in un .modulo del cpp non è stato sufficiente per ottenere il creato? Si potrebbe pensare che la DLL generazione potrebbe almeno bandiera come errore…

Lascia un commento