Problem mit mehrfach eingebundener Header-Datei -> Linker-Fehler



  • Hallo.

    Habe folgendes Problem:
    Habe ne h-Datei, in der der Prototyp einer Funktion definiert wird.
    Diese Funktion wird dann in der zugehörigen cpp-Datei implementiert und in einer anderen cpp-Datei verwendet. Also binden beide cpp-Dateien den Header ein, in welchem die Funktion definiert ist.

    Header:

    #ifndef GRAPHIC_DIALOG_H
    #define GRAPHIC_DIALOG_H
    
    //[...]
    
    BOOL CALLBACK GraphicDialogMsg(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
    
    //[...]
    
    #endif
    

    Wie gesagt, der Header wird von zwei verschiedenen cpp-Dateien eingebunden, daraufhin meldet sich der Linker bezüglich eines mehrfach definierten Symbols:

    GraphicDialog.obj : error LNK2005: "int __stdcall GraphicDialogMsg(struct HWND__ *,unsigned int,unsigned int,long)" (?GraphicDialogMsg@@YGHPAUHWND__@@IIJ@Z) ist bereits in Game.obj definiert.
    C:\Projekte\2D-Engine\Debug\2D-Engine.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.

    Dachte eigentlich, dass ich das Problem mit #ifndef umgehen kann.. (?)

    Wo ist da mein Fehler?
    Hoffe, ihr könnt mir helfen.

    MfG
    Hundefutter



  • Also du musst offenbar in dem Header eine Funktion _definiert_ haben. Damit landet die Implementierung dem Modul (.obj oder wie das bei deinem Compiler ist) einer jeden .cpp-Datei, die den Header einbindet. Wenn der Linker dann die .obj-Dateien zusammenführen möchte, findet er auf einmal für ein und die selbe Funktion X Implementierungen (X-mal Code). Das führt dann zu dieser Fehlermeldung.

    Viele Grüße,
    Michael



  • Die Deklaration darf, soweit ich weiß, so oft in einer Cpp-Datei drin stehen, wie sie will. Bist du dir sicher, dass die Implementation nicht aus Versehen auch noch in einer anderen Cpp-Datei drin steht? Und ansonsten sind vielleicht die Objekt-Dateien durcheinander geraten, also einfach mal das Projekt bereinigen und neu erstellen.



  • Oh, ich hab eigentlich nur auf die Fehlermeldung geschaut und nicht darauf, dass der TE audrücklich sagt, dass der Header nur deklariert 🙂 Problem ist natürlich dasselbe.



  • Hui, das ging ja schnell... 🙂
    War mir eigentlich recht sicher, dass die Funktion nur ein mal im Header definiert war und dann auch nur ein mal in einer der beiden cpp-Dateien implementiert wurde.
    Habe daraufhin den Hinweis mit dem Bereinigen des Projektes versucht und nun funktioniert es... Naja, versteht das mal wer will..

    Danke für die schnelle Hilfe!

    MfG
    Hundefutter



  • Hundefutter schrieb:

    dass die Funktion nur ein mal im Header definiert war und dann auch nur ein mal in einer der beiden cpp-Dateien implementiert wurde.

    Nur der Vollständigkeit halber und um späteren Missverständnissen vorzubeugen:
    Die Definition einer Funktion IST ihre Implementation. Der Funktionskopf alleine ohne den Rumpf, also das was normalerweise im Header steht, nennt man Deklaration.


Anmelden zum Antworten