mehrfach definiertes Symbol gefunden
-
Hallo,
mein Name ist Aaron und ich bin neu hier. Vor ein paar Tagen habe ich angefangen C++ zu lernen und bin auch recht schnell weitergekommen. Nun sitze ich an einem Problem fest. Ich versuche grade, in anderen Header bzw. cpp Dateien definierte Klassen und Memberfunktionen in mein Programm einzubinden. Zum testen habe ich einen main.cpp, eine winone.h und eine winone.cpp Datei erstellt. Das Programm ist ledeglich ein Test und eigentlich nicht brauchbar. Mein Problem ist, dass ich mein Compiler mir immer diese Fehlermeldungen ausgibt:error LNK2005: "int __cdecl maximise(int,int)" (?maximise@@YAHHH@Z) ist bereits in main.obj definiert.
...Klassen2.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.Am besten schreibe ich einfach den Quelltext der 3 Dateien rein, damit ihr euch das mal ansehen könnt.
//main.cpp #ifndef IOSTREAM #define IOSTREAM #include <iostream> #endif #ifndef WINONE_CPP #define WINONE_CPP #include "winone.cpp" #endif #ifndef WINONE_H #define WINONE_H #include "winone.h" #endif using namespace std; int main() { int länge = 200; int höhe = 250; maximise(länge, höhe); cout << länge << " " << höhe << endl; system("pause"); }//winone.cpp #ifndef WINONE_H #define WINONE_H #include "winone.h" #endif using namespace std; int maximise(int länge, int höhe) { länge = 1920; höhe = 1080; return länge, höhe; }//winone.h class winone { private: int länge; int höhe; public: int maximise(int länge, int höhe); };Falls ihr noch irgendwelche Informationen braucht, sagt bescheid.
MfG Aaron
-
Wo soll man anfangen?
1. KEINE CPP-DATEIEN INCLUDEN, dann kommen solche Fehler auch nicht!
2. Include Guards nur in Header und auch in den File dort hinein!
3. Schaue dir noch mal an, wie man Memberfunktionen außerhalb der Klasse definiert...
-
...
-
Wieso hat
winone::maximiseeinenintals Rückgabewert? Die Änderung bezieht sich ja auf die Instanz selbst (sonst wäre die Methode konstant) und dann würde ich entwedervoidoder eine Referenz auf die Instanz zurückgeben.Der Rest wurde schon gesagt...
-
Pringles1996 schrieb:
Ich versuche grade, in anderen Header bzw. cpp Dateien definierte Klassen und Memberfunktionen in mein Programm einzubinden. Zum testen habe ich einen main.cpp, eine winone.h und eine winone.cpp Datei erstellt. Das Programm ist ledeglich ein Test und eigentlich nicht brauchbar. Mein Problem ist, dass ich mein Compiler mir immer diese Fehlermeldungen ausgibt:
error LNK2005: "int __cdecl maximise(int,int)" (?maximise@@YAHHH@Z) ist bereits in main.obj definiert.
...Klassen2.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.Am besten schreibe ich einfach den Quelltext der 3 Dateien rein, damit ihr euch das mal ansehen könnt. [...]
Also erstmal: Die Include-Guards (#ifdef und co) schreibt man in die Header-Dateien selbst rein, damit man das nicht überall, wo man sie inkludieren will, machen muss.
Aufgrund Deiner Includes passiert folgendes:
- Der Präprocessor schnürt ausgehend von main.cpp den Inhalt der Dateien main.cpp, iostream, winone.h winone.cpp zu einer Übersetzungeinheit zusammen
- Der Präprozessor schnürt ausgehend von winone.cpp den Inhalt der Dateien winone.h und winone.cpp zu einer Übersetzungseinheit zusammenDann ist der Compiler dran. Er kompiliert beide Übersetzungseinheiten:
- aus main.cpp + iostream + winone.h + winone.cpp wird main.obj
- aus winone.cpp + winone.h wird winone.objBeachte, dass sowohl in main.obj als auch in winone.obj die freie Funktion maximise definiert ist, die im Übrigen nichts mit deiner winone-Klasse zu tun hat. Elementfunktionen definiert man anders.
Dann ist der Linker dran: Er will die verschiedenen kompilierten Übersetzungseinheiten (*.obj) zusammen verknoten und bemerkt dabei, dass du die ODR (one-definition-rule) verletzt hast, denn in deinem Programm darf die Funktion maximize nur einmal definiert sein. Dass die Definition in nur einer einzigen Datei drin steht, spielt gar keine Rolle, da du diesen Text ja auch in main.cpp inkludierst. Das Inkludieren ist ja nur eine Text-Ersetzung.