"unresolved external symbol" bei bestimmter Klasse
-
Hab ich schon versucht, danke. Hilft leider nicht.
Löschen des Debug-Ordners und neukompilieren führt übrigens zum gleichen Resultat wie eingangs beschrieben.
-
Ich erlaub mir mal, das zu pushen...
Meine Suche hat immer noch nichts ergeben, mittlerweile kenne ich sogar die Linker-Optionen ^^
Falls es hilft, hier mal der komplette Code der betreffenden Klasse:
BBPositionInterface.h
/* Interface für BBPosition. Sollte von allen Klassen implementiert werden, die eine BBPosition verwenden. */ #pragma once #include "BBPosition.h" class BBPositionInterface { public: BBPositionInterface(void); BBPositionInterface(BBPosition *p); virtual ~BBPositionInterface(void); inline void SetPosition(BBVector &p); inline void SetVelocity(BBVector &m); inline void SetAcceleration(BBVector &a); inline BBVector GetPosition(); inline BBVector GetVelocity(); inline BBVector GetAcceleration(); inline void Move(BBVector &m); protected: BBPosition *m_pPosition; };BBPositionInterface.cpp
#include "BBPositionInterface.h" BBPositionInterface::BBPositionInterface(void) { m_pPosition = new BBPosition(); } BBPositionInterface::BBPositionInterface(BBPosition *p) { m_pPosition = p; p->Attach(); } BBPositionInterface::~BBPositionInterface(void) { m_pPosition->Detach(); } void BBPositionInterface::SetPosition(BBVector &p) { m_pPosition->SetPosition(p); } void BBPositionInterface::SetVelocity(BBVector &v) { m_pPosition->SetVelocity(v); } void BBPositionInterface::SetAcceleration(BBVector &a) { m_pPosition->SetAcceleration(a); } void BBPositionInterface::Move(BBVector &m) { m_pPosition->Move(m); } BBVector BBPositionInterface::GetPosition() { return m_pPosition->GetPosition(); } BBVector BBPositionInterface::GetVelocity() { return m_pPosition->GetVelocity(); } BBVector BBPositionInterface::GetAcceleration() { return m_pPosition->GetAcceleration(); }sowie alle Fehler
1>BBGSprite.obj : error LNK2019: unresolved external symbol "public: class BBVector __thiscall BBPositionInterface::GetPosition(void)" (?GetPosition@BBPositionInterface@@QAE?AVBBVector@@XZ) referenced in function "public: virtual void __thiscall BBGSprite::Draw(void)" (?Draw@BBGSprite@@UAEXXZ) 1>BBPObject.obj : error LNK2001: unresolved external symbol "public: class BBVector __thiscall BBPositionInterface::GetPosition(void)" (?GetPosition@BBPositionInterface@@QAE?AVBBVector@@XZ) 1>BBGText.obj : error LNK2019: unresolved external symbol "public: void __thiscall BBPositionInterface::SetPosition(class BBVector &)" (?SetPosition@BBPositionInterface@@QAEXAAVBBVector@@@Z) referenced in function "public: void __thiscall BBGText::SetPosition(class BBVector &)" (?SetPosition@BBGText@@QAEXAAVBBVector@@@Z) 1>BBPObject.obj : error LNK2001: unresolved external symbol "public: void __thiscall BBPositionInterface::SetPosition(class BBVector &)" (?SetPosition@BBPositionInterface@@QAEXAAVBBVector@@@Z) 1>BBPObject.obj : error LNK2019: unresolved external symbol "public: void __thiscall BBPositionInterface::SetVelocity(class BBVector &)" (?SetVelocity@BBPositionInterface@@QAEXAAVBBVector@@@Z) referenced in function "public: class BBVector __thiscall BBPObject::Advance(float)" (?Advance@BBPObject@@QAE?AVBBVector@@M@Z) 1>BBPObject.obj : error LNK2019: unresolved external symbol "public: class BBVector __thiscall BBPositionInterface::GetVelocity(void)" (?GetVelocity@BBPositionInterface@@QAE?AVBBVector@@XZ) referenced in function "public: class BBVector __thiscall BBPObject::Advance(float)" (?Advance@BBPObject@@QAE?AVBBVector@@M@Z) 1>BBPObject.obj : error LNK2019: unresolved external symbol "public: class BBVector __thiscall BBPositionInterface::GetAcceleration(void)" (?GetAcceleration@BBPositionInterface@@QAE?AVBBVector@@XZ) referenced in function "public: class BBVector __thiscall BBPObject::Advance(float)" (?Advance@BBPObject@@QAE?AVBBVector@@M@Z)Ich hoffe, jemand von euch entdeckt den Haken, das Problem beschäftigt mich schon lange

MfG
-
Hast Du BBPositionInterface.cpp auch wirklich kompiliert?
Will heissen, ist es im Make oder Projekt oder wo auch immer es kompiliert wird angegeben?Simon
-
Ja.
Ich arbeite mit VS2008, im Build-Log wird explizit angegeben, dass die Datei kompiliert wird. Ein entsprechendes .obj ist auch vorhanden
Gruss
-
Ich bin mir nicht sicher, aber könnte es an dem inline liegen? Versuch doch mal ob es ohne inline tut.
-
Leider bereits erfolglos versucht

-
Verschiebe doch mal die ge'inlineten Funktionen von der *.cpp in die *.h.
-
das_brot schrieb:
Das Problem scheint irgendwo in der "Verlinkung" von .cpp und .h zu liegen, wenn ich den Funktionsrumpf in die .h integriere, verschwindet der Fehler.
Klappt so, aber das wäre sehr unschön.
Seltsam ist: im restlichen Projekt funktionieren ausgelagerte Funktionsrümpfe (auch inline-Funktionen)...Gruss
-
Um mit dem Ratespiel mal fortzufahren...
Du definierst ein Interface (eigentlich eine voll funktionsfähige Klasse). Die Methode SetPosition(...) wird von dir ebenfalls definiert.
In deiner abgeleiteten definierst du diese Methode neu, ohne eine Funktionalität zu ändern. Lasse diese Überladung einfach mal aus, da diese faktisch überflüssig ist. Solltest du das Verhalten bei SetPosition (bei gleicher Signatur) in der abgeleiteten Klasse ändern, deklariere die Methode in der Basisklasse als virtuell (ebenso den Destruktor).
Grüße... Heiko
-
das_brot schrieb:
das_brot schrieb:
Das Problem scheint irgendwo in der "Verlinkung" von .cpp und .h zu liegen, wenn ich den Funktionsrumpf in die .h integriere, verschwindet der Fehler.
Klappt so, aber das wäre sehr unschön.
Seltsam ist: im restlichen Projekt funktionieren ausgelagerte Funktionsrümpfe (auch inline-Funktionen)...Gruss
Oh, sorry, habe ich überlesen

Ich wüsste allerdings auch nicht, wie man inline in *.cpp Dateien verwenden soll, da das m.M.n. dem inline völlig zuwider liegt. inline wird ja vom Compiler "genutzt", *.cpp Dateien werden aber vom Linker zu einer Einheit verarbeitet.
Mach dir das so klar:
Stell dir vor, du hast eine Drittanbieter Lib. mit Headern und vorkompilierten *.lib Dateien. D.h. du kennst die interne Implementation nicht, da du die *.cpps nicht kennst. Jetzt steht in einer Header-Datei:
inline int getBla();
Da inline vom Compiler verarbeitet wird, findet dieser allerdings die Funktion nicht im Code, um den Aufruf zu inlinen. Also gibt's 'ne tolle Fehlermeldung.----
Ich bin nicht unglaublich bewandert in dem Thema und es mag sein, dass ich den totalen Bullshit rede, falls dem so ist: Bitte aufklären

-
Heiko:
Danke, das funktioniert so. Seltsamerweise muss ich aber alle inline-Funktionen als virtual definieren, auch wenn diese in keiner erbenden Klasse verändert werden. Ansonsten hagelts die Linker-Errors.
Weiss jemand, warum das so ist? Mein Verständnis von virtual ist, dass ich es nur brauche, wenn die abgeleitete Klasse die Methode überschreiben können soll...
vielleicht:
Ich denke mir, der Code aus der .lib wird einfach dupliziert, falls im Header inline angegeben ist, anstatt ihn nur einmal zentral im .exe abzulegen.
Aber auch ich bin da nicht so bewandert ^^Gruss und Danke für die rege Mithilfe!