Problem mit Headerwächter
-
Hallo.
Ich füge eine Datei extern vom Projekt ein.
Die eingefügte Datei:#ifndef RNE_NAMEN_H #define RNE_NAMEN_H //... #endifQt beschwert sich trotzdem über eine doppelte definition aller Funktionen.
Wie kann das sein?
-
Wie lautet die Fehlermeldung? Sind die Funktionen möglicherweise im Header definiert (nicht nur deklariert)?
-
Pro Funktion erscheinen 2 Infos:
1.: Multiple Defination of <Funktion>
<pfad>
2.: First defination here <Funktion>
File not found: depug/main.o:<pfad>Zum Schluß eine Fehlermeldung:
collect2: Id ruturned 1 exit status
-
Was meinst du dazu:
Nexus schrieb:
Sind die Funktionen möglicherweise im Header definiert (nicht nur deklariert)?
Um mehr sagen zu können, solltest du ein bisschen Code posten. Aber den repräsentativen Teil - so, dass er dein Problem wiederspiegelt, aber dass man sich nicht durch Hunderte von Zeilen wühlen muss.

-
In der Headerdatei ist eine Klasse definiert, die eine CPP-Datei einfügt die deren Methoden deklariert.
Was meinst du mit repräsentativen Teil?
-
Naja, ein Stück Code, das den Sachverhalt beschreibt.
Ich hätte mir vorgestellt, dass so was das Problem sein könnte:
// Header.hpp class MyClass { void Function(); }; void MyClass::Function() { }Und dieser Header würde in mehreren Modulen eingebunden. Bist du sicher, dass keine Funktionen im Header definiert werden (ausser sie sind inline)? An den Headerguards liegt es wahrscheinlich nicht, da der Compiler sich über eine mehrfache Klassendefinition beschweren müsste.
-
So etwa?
Namen.h
#ifndef RNE_NAMEN_H #define RNE_NAMEN_H //Includes //Klasse class Namen { public: Namen(std::string); int getMNamen(); void delDouble(); void saveAs(std::string); void listAll(); void showData(); std::string getRandomName(); //...andere Methoden und Atribute }; bool operator<(const Namen::Vorname&,const Namen::Vorname&); std::ostream& operator<<(std::ostream&,Namen::Vorname); std::ofstream& operator<<(std::ofstream&,Namen::Vorname); #endifNamen.cpp
Namen::Namen(std::string DB_ID):fid(DB_ID) { //... } int Namen::getMNamen() { //... } long Namen::getVNSize() { //... } long Namen::getNNSize() { //... } void Namen::open(std::string lang) { //... } //...
-
Ja, etwa so...
Aber du scheinst alle Funktionen in der CPP-Datei definiert zu haben, was eigentlich okay sein sollte. Trifft das für jene Funktionen, die in der Linkerfehlermeldung genannt werden, auch zu?
-
Dumme Idee, aber ich will trotzdem mal gefragt haben:
Bindest du zufälligerweise irgendwo die*.cppein, statt der*.h?Übrigens, die Überladung für den
operator <<mitstd::ostreamreicht schon aus.std::ofstreamleitet vonstd::ostreamab
Zudem würde ich die Variablennamen der Funktionsparameter auch im Header angeben. Aber das ist eine Stilfrage, also jeder wie er will.Grüssli
-
Dravere schrieb:
Dumme Idee, aber ich will trotzdem mal gefragt haben:
Bindest du zufälligerweise irgendwo die*.cppein, statt der*.h?Nein hab geschaut. Und überhaupt: Ich binde sie nur einmal ein.
Dravere schrieb:
Übrigens, die Überladung für den
operator <<mitstd::ostreamreicht schon aus.std::ofstreamleitet vonstd::ostreamab
Das weiß ich, aber meine Überladungen underscheiden sich.
Nexus schrieb:
Trifft das für jene Funktionen, die in der Linkerfehlermeldung genannt werden, auch zu?
Ja. Es wird aber nur 1 Fehler gemeldet, der Rest sind Infos
Ich hab mal folgendes zu Testzwecken geschrieben:
int i(int r){return r;} int i(int r){return r;}Das Ergebnis war eine Fehlermeldung: 'int i(int)' previosly defined here, wobei das nicht dieselbe Meldung als die anderen sind.
Wenn ich nur int i(int r){return r;} in Namen.h schreibe, taucht die Funcktion nicht der Fehlerliste auf
-
Hallo!
Ich hab das Programm jetzt in Java geschrieben und es funktioniert.