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
    //...
    #endif
    

    Qt 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);
    #endif
    

    Namen.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?


  • Administrator

    Dumme Idee, aber ich will trotzdem mal gefragt haben:
    Bindest du zufälligerweise irgendwo die *.cpp ein, statt der *.h ?

    Übrigens, die Überladung für den operator << mit std::ostream reicht schon aus. std::ofstream leitet von std::ostream ab 😉
    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 *.cpp ein, statt der *.h ?

    Nein hab geschaut. Und überhaupt: Ich binde sie nur einmal ein.

    Dravere schrieb:

    Übrigens, die Überladung für den operator << mit std::ostream reicht schon aus. std::ofstream leitet von std::ostream ab 😉

    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.


Anmelden zum Antworten