LNK2005 - already defined in ... error



  • Hi!

    In meiner Projektstruktur habe ich ein main-Files mit winmain etc drin .. dann mehrere Klassem alle jeweils in den entsprechenden .h und .cpp files

    Dann linke include ich noch in manchen .h bzw .cpp files die genesis3d.h dazu, da ich die für mein Projekt benötige.

    Soweit so gut

    Dazu hab ich mir noch eine Log-Funktion geschrieben (eine reine CFunktion) die in einer tools.h sitzt

    #ifndef __tools_h__
    #define __tools_h__
    
    #include <stdarg.h>
    
    FILE *Protokoll;
    
    void LogEvent(char* textstring,...)
    {
    	va_list args;
    	va_start(args,textstring);
    	char str1[512];
    
    	vsprintf(str1,textstring,args);
    	Protokoll=fopen("protokoll.txt","a+");
    	fprintf(Protokoll,str1);
    
    	fprintf(Protokoll,"\n");
    	fclose(Protokoll);
    }
    
    #endif
    

    so - diese möcht ich nun in die verschienden .cpp files der Klassen inkludieren, da ja da geloggt werden soll. Geht aber nicht - es kommen die Fehlermeldungen wie

    vmApplication.obj : error LNK2005: "void __cdecl LogEvent(char *,...)" (?LogEvent@@YAXPADZZ) already defined in ICS.OBJ
    vmApplication.obj : error LNK2005: "struct _iobuf * Protokoll" (?Protokoll@@3PAU_iobuf@@A) already defined in ICS.OBJ

    Im Groben ist mir schon klar, wie der Fehler zustande kommt, nur komm ich nicht weiter im Beseitigen! Was zur Hölle muss ich im File ICS.h pder ICS.cpp ändern? Diese Dateien inkludieren nicht mal die tools.h!

    danke!



  • Ist in der Datei auch eine LogEvent Funktion? Dann hast de schon den übeltäter.



  • (D)Evil schrieb:

    Ist in der Datei auch eine LogEvent Funktion? Dann hast de schon den übeltäter.

    ok... aber wie dann korrekt machen? tools.h und tools.cpp ?!



  • Also, ich meinte damit, das du in der ics.h/cpp schon diese Funktion hast, und dann in einer anderen Datei die tools.h und die ics.h includet hast.



  • mach ein static davor



  • ...

    nun hab ichs in tools.h und tools.cpp gegliedert und es geht 1a

    man sollte sich halt doch an die Konventionen halten 🤡


Anmelden zum Antworten