Chcę zdefiniować klasę pochodną w oparciu o wyeksportowaną klasę dll. Klasa podstawowa jest zdefiniowana w Projekcie A, a klasa pochodna jest w Projekcie B.nierozwiązany symbol zewnętrzny dla __declspec (dllimport) podczas używania biblioteki dll do eksportu klasy
Po pierwsze, w Projekcie A zdefiniowano preprocesor MYDLL_BUILD. I użyć pliku nagłówka określić eksport/import:
#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
Potem zdefiniować klasę bazową:
class MYDLL_API DllObject
{
public:
virtual ~DllObject() {}
protected:
DllObject() { m_count = 3; }
private:
int m_count;
};
W projekcie B, MYDLL_BUILD preprocesor nie jest zdefiniowana. Oto klasa pochodna:
class MyClass : public DllObject
{
public:
~MyClass(){}
MyClass() { m_data = 20; }
private:
int m_data;
};
mam włączone dll i lib plik, ale nadal mam nierozwiązanych zewnętrznego błędu Symbol:
2>Test_Entry.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual __thiscall ADAI::DllObject::~DllObject(void)" ([email protected]@@[email protected]) referenced in function "public: virtual __thiscall MyClass::~MyClass(void)" ([email protected]@[email protected])
2>Test_Entry.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) protected: __thiscall ADAI::DllObject::DllObject(void)" ([email protected]@@[email protected]) referenced in function "public: __thiscall MyClass::MyClass(void)" ([email protected]@[email protected])
2>c:\Users\Adai\Documents\Visual Studio 2010\Projects\Test_Main\Debug\Test_Main.exe : fatal error LNK1120: 2 unresolved externals
I wyszukiwane w Internecie, większość odpowiedzi twierdzą, że brak biblioteki. Ale te instrukcje nie rozwiązują mojego problemu.
Kiedy zmienić
class MYDLL_API DllObject
do
class __declspec(dllexport) DllObject
Rozwiązanie kompiluje bez błędów. Naprawdę nie rozumiem powodu. Czy ktoś może Ci pomóc? Z góry dziękuję.
Wydaje się, że 'MYDLL_API' nie jest zdefiniowany w Projekcie A tak, jak tego oczekujesz. Pobierz VS, aby wygenerować wstępnie przetworzoną wersję pliku, który definiuje DllObject (kliknij prawym przyciskiem myszy na pliku, przejdź do właściwości, rozwiń C/C++ i sprawdź opcje preprocesora). Upewnij się, że dane wyjściowe zawierają 'class __declspec (dllexport) DllObject', a nie' class __declspec (dllimport) DllObject' – Praetorian
Nie można wygenerować błędów łącznika w opublikowanym fragmencie kodu. Napisałeś kod w pliku nagłówkowym. Tak więc, gdy #include to, nie ma żadnego uzależnienia od biblioteki DLL .lib. Na wypadek, gdybyśmy nie patrzyli na prawdziwy kod, brzmi to tak, jakbyście nie poprawili poprawnie #Define MYDLL_BUILD. –
Dzięki za odpowiedź. DllObject ma tylko plik nagłówkowy, nie ma pliku cpp. Nie mogę wygenerować wstępnie przetworzonego pliku dla obiektu DllObject. Preprocesor MYDLL_BUILD jest zdefiniowany we właściwościach Projektu A. Kody, które wkleiłem powyżej, są kodami rzeczywistymi, ale to tylko część, którą myślę, powiązaną z komunikatem o błędzie. – Chtoucas