unresolved external symbol
-
error LNK2019: unresolved external symbol "__declspec(dllimport) public: void __thiscall MyClass::doSomething(class ATL::CStringT<wchar_t,class StrTraitMFC_DLL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > > &,bool)" (__imp_?doSomething@MyClass@@QAEXAAV?StrTraitMFC_DLL@_WV?$ChTraitsCRT@_W@ATL@@@@@ATL@@_N@Z)
referenced in function
"public: int __thiscall FooBar::create_XY(class ATL::CStringT<wchar_t,class StrTraitMFC_DLL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > > &)" (?create_XY@FooBar@@QAEHAAV?StrTraitMFC_DLL@_WV?$ChTraitsCRT@_W@ATL@@@@@ATL@@@Z) FooBar.obj
Eigentlich ja ganz eindeutig.
Die Definition MyClass::doSomething ist nicht bekannt.Also stimmt irgendwas mit den Projekt/Link Einstellungen nicht. Denn kompilieren tut er. ABER was ich nicht verstehe, dass er vorher im Code durchaus Instanzen und andere Methoden von MyClass verwendet und nur explizit bei doSomething rausspringt.
Meine Logik ist ja: Wenn er Instanzen aufbauen kann, und sogar einige Methoden verwenden kann, ist die komplette Klasse bekannt.
Wie kann es angehen, dass nur eine Methode zu einem LNK2019 führt?
Wenn man bei der Deklaration das DLL Import/Export vergisst, aber das hab ich über die komplette Klasse gemacht.
-
jakuoiz schrieb:
Eigentlich ja ganz eindeutig.
Die Definition MyClass::doSomething ist nicht bekannt.Ich denke, du hast die Fehlermeldung nicht verstanden. Das ist ein Fehler vom Linker. MyClass::doSomething ist bekannt, es ist aber nicht da. Das heißt, du hast irgendwann (in der Klassendefinition) gesagt, dass es eine Memberfunktion doSomething gibt. Die wurde auch benutzt. Da bekannt war, dass es sie geben soll, war das auch kein Fehler - sie kann (und wird in vielen Fällen) schließlich in einer anderen Übersetzungseinheit stehen. Als der Linker dann alles zusammensetzen wollte, hat er den Aufruf von MyClass::doSomething gefunden, aber nirgends ein MyClass::doSomething.
-
Ah, ich sehe gerade, dass diese Methode auch die einzige ist, die nicht in der Cpp sondern noch in der .h definiert witd.
Hat es damit was zu tun?class DLL_API MyClass { public: MyClass(void); MyClass(void); void MethodX(); int MethodY(bool b= FALSE); void doSomething(CString& strVal, bool bAppend = FALSE) { // do something } int AnotherMethod(int value); };
-
jakuoiz schrieb:
Hat es damit was zu tun?
Möglich, aber unwahrscheinlich. Kommt drauf an, was du genau gemacht hast. Durch die Definition innerhalb der Klassendefinition ist die MEthode implizit inline, was sich auf die Bindung auswirkt. Aber dann müsstest du sie auf recht ungewöhnliche Art und Weise aufgerufen haben. Zeig doch mal, was du genau gemacht hast. Aber nicht alles. Lies dir mal den dritten Link in meiner Signatur durch, um zu erfahren, wie du das Problem so darstellen kannst, dass dir hier auch geholfen werden kann, anstatt dass wir nur raten, was dein Problem sein könnte.
-
Ich tippe mal drauf, dass du diese Klasse per dllexport in eine dll exportierst. Ich vermute mal, dass inline Funktionen dabei problematisch sind. Versuch mal, die Funktion explizit nochmal als dllexport zu deklarieren. Oder besser noch: Definier sie einfach nicht inline, das macht sowieso keinen Sinn, wenn sie aus der dll kommen soll...