Hilfe zu: error LNK2001: Nichtaufgeloestes externes Symbol
-
Schnelle Hilfe erwünscht
Ich habe offenbar ein ähnliches Problem wie Frank Gitzinger. Ich programmiere eine Baumdarstellung einer Datenmenge mit der Oberfläche Qt der Firma Trolltech. Als Compiler verwende ich MSVC++.
Ich haben zwei Klassen geschrieben, 'CicdRoot' und 'CicdNode', doch sobald ich z.B. ein Objekt vom Typ 'CicdRoot' erzeugen will, erhalte ich folgende Fehlermeldung:
error LNK2001: Nichtaufgelöstes externes Symbol "public: __thiscall CicdRoot::CicdRoot(void)" (??0CicdRoot@@QAE@XZ)
fatal error LNK1120: 1 unaufgeloeste externe Verweise
fatal error U1077: 'link' : Rueckgabe-Code '0x460'

Vielen Dank für jedwede Hilfe
dumbledore
-
such mal in der MSDN nach "Linker Tools Error LNK2001", da wirste bestimmt was finden
-
also prinzipiell wird deine funktion CicdRoot::CicdRoot(void) nicht gefunden,
d.h. du hast in deiner header datei der klasse CicdRoot eine funktion mit entweder falschem rueckgabe oder paramter werten. guck mal ob du eventuell ein deklaration der funktion in einer anderen datei brauchst: kann passieren wenn beim compilieren die funktions definition plötzlich nach dem aufruf steht.
probier mal dort wo du die funktion aufrufst (source file) eine deklaration mit "extern" zu machen:extern CicdRoot::CicdRoot(void);das hilft meistens um recursive header links zu verhindern.
-
und schau einfach mal, ob du den konstruktor implementiert hast. vermute, ihm fehlt einfach sein "körper"
-
An Red Skall: Das hilft mir nicht! Was ist MSDN? Außerdem nutze ich ja (gezwungenermaßen) die Oberfläche von MSVC++ gar nicht, sondern nur den Compiler über Kommandoebene.
An Gehirnmann!: Die Idee mit 'extern' hat leider nicht funktioniert. Die Klasse 'CicdRoot' erkennt der Compiler. Die Definition 'CicdRoot *root' akzeptiert er fehlerlos. Aber beim Erzeugen eines Objektes mit 'root = new CicdRoot();' produziert er die erwähnte Fehlermeldung. (Dasselbe Problem hat der Compiler mit der Klasse CicdNode).
An elise: Der Kostruktor ist impelmenttiert. Er lautet
CicdRoot::CicdRoot() {}
Doch anscheinend findet ihn der Compiler nicht?Bin immer noch ziemlich ratlos. Trotzdem Danke.
dumbledore
-
MSDN: Microsoft Developer Network
da gibt dir microsoft ne ganze menge tips. und wenn du nach diner error-bezeichnung suchst, dann werden die dir wahrscheinlich sagen, wie du den fehler beheben kannst, oder ne hilfe geben was du falsch gemacht hast.wenn du den fehler kennst, kannst du die fehlerquelle eingrenzen.
-
habe MSDN gefunden. Werde aber aus den unter 'LNK2001' angegebenen Bemerkungen nicht richtig schlau.
'Diese Fehlermeldung wird durch Code verursacht, wenn er auf etwas (z.B. eine Funktion, Variable oder Sprungmarke) verweist, das der Linker weder in den durchsuchten Bibliotheken noch in duchsuchten Objektdateien finden kann.'
so heißt es dort. Doch eine Definition einer Variablen vom Typ 'CicdRoot' verursacht keine Probleme, wieso die Erzeugung eines Objekts vom Typ 'CicdRoot' mittels 'new'? Wenn die Klasse 'CicdRoot' erkannt wird, wieso läßt sich dann kein Objekt dieser KLasse erzeugen?
Auf jeden Fall danke für den Tip

dumbledore
-
mhh, schreib doch mal etwas code ...