Undefinied Reference to...



  • naja die Notice.Class.h sollte in deinem fall direkt in deinem projektverzeichnis liegen...

    Bin mir aber nicht ganz sicher inwiefern das Ding zwei Punkte in Dateinamen akzeptiert. Sollte aber theoretisch funzen.



  • It0101 schrieb:

    naja die Notice.Class.h sollte in deinem fall direkt in deinem projektverzeichnis liegen...

    Bin mir aber nicht ganz sicher inwiefern das Ding zwei Punkte in Dateinamen akzeptiert. Sollte aber theoretisch funzen.

    Ich glaube, man kann jeden Scheiß im Dateinamen verwenden. Alles, was in Dateinamen halt so erlaubt ist. Du kannst ja auch Nicht-Header-Dateien inkludieren (.c, .cpp, .txt, .wasweissich)...



  • Nur das bei der Endung .c manche Compiler versuchen C zu kompilieren statt C++. Das gibt dann natürlich Probleme.



  • Hab ich nun mal geändert. Beide c Dateien sind nun cpp Dateien, doch wieder sowas:

    C:\Users\White\Desktop>g++ -o notice.exe notice.cpp
    C:\Users\White\AppData\Local\Temp/cc783PJK.o:notice.cpp:(.text+0x12f): undefined reference to `Notic
    e::Notice()'
    collect2: ld returned 1 exit status

    😕



  • wenn du es so kompilierst, ist ja klar.
    Du musst schon beide cpp Dateien angebenoO



  • JustAnotherNoob schrieb:

    wenn du es so kompilierst, ist ja klar.
    Du musst schon beide cpp Dateien angebenoO

    und das mache ich wie?

    g++ -o notice.exe notice.class.exe notice.cpp notice.class.cpp
    

    oder wie?
    wieso is das eigentlich wichtig, die wird doch per include eingelesen dachte ich.



  • Nein, inkludiert werden nur die Header-Dateien, die du in deinen Sourcen inkludierst. Und CPP-Dateien werden nicht inkludiert! Auch nicht im Source.

    CPP-Dateien sind sogenannte Übersetzungseinheiten. D.h. man übersetzt immer eine CPP-Datei für sich alleine. Aus jeder CPP-Datei wird eine OBJ-Datei (Object = übersetze Einheit). Am Ende werden alle OBJ-Dateien vom Linker zu einer EXE gelinkt (verbunden).

    So, d.h. der Linker sucht alle OBJ-Dateien zusammen und löst die übersetzten Referenzen (Funktionen, Klassen usw.) auf. Fehlt eine übersetzte Referenz, gibts einen Error. Und den hast du ja ebend erhalten.



  • Aso, wieder was gelernt 🙂
    Also muss ich jetzt beide cpp Dateien für sich compilieren oder wie?
    also

    g++ -o notice.exe notice.cpp
    
    g++ -o notice.class.exe notice.class.cpp
    


  • du willst ja nur eine .exe
    entweder so:
    g++ -onotice.exe notice.cpp notice.class.cpp
    oder so(Der Vorteil hierbei ist, dass man einzeln steuern kann was kompiliert wird und man dadurch Zeitspaart. Stichwort Gnu Make, oder ähnliche Buildsysteme):
    g++ -c notice.cpp
    g++ -c notice.class.cpp
    g++ -onotice.exe notice.o notice.class.o



  • Aso, wieder was gelernt
    Also muss ich jetzt beide cpp Dateien für sich compilieren oder wie?

    Dein Kommando war falsch, aber JustAnotherNoob hat es richtig gestellt. Du kannst natürlich auch alle CPP-Dateien in einem Rutsch mitgeben. Aber du mußt halt wissen, das der Compiler es am Ende halt trotzdem einzeln kompiliert.

    Aber eines wird dann deutlich:

    g++ -c notice.cpp 
    g++ -c notice.class.cpp
    

    Hier werden die Übersetzungseinheiten einzeln kompiliert und der Compiler erzeugt Objekt-Dateien. (da steht der kompilierte Code drin)
    Und dann können die Objekt-Dateien verlinkt werden:

    g++ -o notice.exe notice.o notice.class.o
    

    Folgendes ist natürlich nur eine kürzere Variante:

    g++ -o notice.exe notice.cpp notice.class.cpp
    

    Aber mit dem kompilieren einzelner Übersetzungseinheiten wird einem erstmal bewusst, wie eigentlich das CPP- und Header-Konzept funktioniert! Man geht immer von einer CPP-Datei aus, die nur Headers inkludiert.
    Die CPP-Datei ist also ein Modul, halt eine Einheit die für sich alleine besteht. Durch die Headers bekommt man nur eine schwache Abhängigkeit zu anderen Übersetzungseinheiten. Das ist wichtig, damit man keine starke Abhängigkeit zwischen Übersetzungseinheiten aufbaut - sonst ist das Modulkonzept nicht haltbar.



  • Gut vielen Dank für die Lektion 🙂


Anmelden zum Antworten