[Gelöst] "undefined reference" bei Basis-Klassendefinitionen



  • Ich habe noch nicht allzu viel Erfahrung mit C++, daher sei es mir bitte verziehen, wenn ich in folgendem Problem nur zu blöd war.

    Es geht hierbei um folgenden Codeteil, den ich hier auf das Notwendige reduziere:

    main.cpp

    // CODE
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    #include "scene.h"     // Scene-Klasse
    // CODE
    
    bool isRunning = true;  // Bool für laufenden Prozess
    
    // CODE
    
    Scene scene(isRunning);
    
    // CODE
    

    scene.h

    // CODE
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class Scene
    {
        string title_;
        bool isRunning_;
        bool test_;
    
        public:
            Scene(bool& isRunning);
            //bool menu();
    
    };
    

    scene.cpp

    #include "scene.h"
    
    Scene::Scene(bool& isRunning)
    {
        cout << "Object scene creation successfull!" << endl;
    }
    

    Wenn ich das Programm nun mit G++ kompiliere, erhalte ich die folgende Fehlermeldung:

    /tmp/cc3QCkkq.o: In function main': main.cpp:(.text+0x71): undefined reference toScene::Scene(bool&)'
    collect2: ld returned 1 exit status

    Es scheint, als würde die Datei scene.cpp nicht mit kompiliert werden, obwohl ich dieses Programmierprinzip im Internet tausendfach gefunden habe. Nie hat es bei mir funktioniert.

    Hat vielleicht jemand eine Ahnung oder zumindest eine Idee, worin der Fehler liegen könnte und wie man diesen lösen könnte?



  • Compilierst du direkt von der Kommandozeile? Wenn ja, mit welchem Befehl?
    (beim Compilieren bzw. beim Linken mußt du alle Dateien angeben, die mit einbezogen werden sollen - was dort fehlt, wird nicht gefunden)

    PS: Was für einen Sinn hat es, den Parameter als Referenz zu übergeben?



  • CStoll schrieb:

    PS: Was für einen Sinn hat es, den Parameter als Referenz zu übergeben?

    Da sie nicht const ist hat er entweder keine Ahnung oder er verändert die innerhalb des Konstruktors.

    EDIT: In Headern solltest du nie " using namespace std; " schreiben. Damit zwingst du den Nutzer deiner Bibliothek, keine Bezeichner aus dem Namensbereich std nutzen zu dürfen.



  • CStoll schrieb:

    Compilierst du direkt von der Kommandozeile? Wenn ja, mit welchem Befehl?
    (beim Compilieren bzw. beim Linken mußt du alle Dateien angeben, die mit einbezogen werden sollen - was dort fehlt, wird nicht gefunden)

    Ich kompiliere mit folgender Zeile im BASH-Terminal (Ubuntu):

    g++ -o [Dateiname] main.cpp -lSDLmain -lSDL -lGL -lSDL_image

    Laut der Tutorials zu dem Thema muss die .cpp nicht mit angegeben werden. Sollte dies falsch sein, bleibt für mich in erster Linie die Frage, wie ich die Datei per g++ einbeziehe.

    CStoll schrieb:

    PS: Was für einen Sinn hat es, den Parameter als Referenz zu übergeben?

    In diesem Fall gar keinen. Ich habe den Parameter nur vorübergehend zu Testzwecken angegeben.

    EOutOfResources schrieb:

    EDIT: In Headern solltest du nie " using namespace std; " schreiben. Damit zwingst du den Nutzer deiner Bibliothek, keine Bezeichner aus dem Namensbereich std nutzen zu dürfen.

    Danke für den Hinweis.



  • Ki schrieb:

    CStoll schrieb:

    Compilierst du direkt von der Kommandozeile? Wenn ja, mit welchem Befehl?
    (beim Compilieren bzw. beim Linken mußt du alle Dateien angeben, die mit einbezogen werden sollen - was dort fehlt, wird nicht gefunden)

    Ich kompiliere mit folgender Zeile im BASH-Terminal (Ubuntu):

    g++ -o [Dateiname] main.cpp -lSDLmain -lSDL -lGL -lSDL_image

    Laut der Tutorials zu dem Thema muss die .cpp nicht mit angegeben werden. Sollte dies falsch sein, bleibt für mich in erster Linie die Frage, wie ich die Datei per g++ einbeziehe.

    Die solltest du genau hinter der main.cpp mit einfügen. Woher soll denn der Compiler sonst wissen, welche Dateien nun zu deinem Programm gehören sollen und welche nur zufällig dort herumliegen?

    (und die meisten Experten verwenden eine IDE, die diese Aufrufe für dich zusammenstellen - oder Makefiles)



  • CStoll schrieb:

    Die solltest du genau hinter der main.cpp mit einfügen. Woher soll denn der Compiler sonst wissen, welche Dateien nun zu deinem Programm gehören sollen und welche nur zufällig dort herumliegen?

    Hatte ich erwähnt, dass ich speziell mit C++ noch sehr wenig Erfahrung habe? 😞

    Meinst du etwa, ich solle beim Kompilieren einfach folgende Zeile verwenden?

    g++ -o [Dateiname] main.cpp scene.cpp -lSDLmain -lSDL -lGL -lSDL_image

    CStoll schrieb:

    (und die meisten Experten verwenden eine IDE, die diese Aufrufe für dich zusammenstellen - oder Makefiles)

    Derzeit ist mir gedit noch lieber als jede IDE. Aber mal sehen, wohin es mich noch trieben wird.



  • Ki schrieb:

    Meinst du etwa, ich solle beim Kompilieren einfach folgende Zeile verwenden?

    g++ -o [Dateiname] main.cpp scene.cpp -lSDLmain -lSDL -lGL -lSDL_image

    Probier's doch einfach aus, aber so sollte es stimmen.

    CStoll schrieb:

    (und die meisten Experten verwenden eine IDE, die diese Aufrufe für dich zusammenstellen - oder Makefiles)

    Derzeit ist mir gedit noch lieber als jede IDE. Aber mal sehen, wohin es mich noch trieben wird.

    Dann solltest du dich auf jeden Fall mit Makefiles beschäftigen 😉 Spätestens wenn du größere Projekte hast, verknotest du dir die Finger bei den Compiler-Aufrufen.



  • CStoll schrieb:

    Probier's doch einfach aus, aber so sollte es stimmen.

    Fehlerfrei kompiliert wird es ja, ich hoffe nur, dass es auch fehlerfrei ausgeführt wird. 🙂

    CStoll schrieb:

    Dann solltest du dich auf jeden Fall mit Makefiles beschäftigen 😉 Spätestens wenn du größere Projekte hast, verknotest du dir die Finger bei den Compiler-Aufrufen.

    Das wäre ohnehin meine nächste Station gewesen.

    Danke für deine Hilfe.



  • Ki schrieb:

    CStoll schrieb:

    Probier's doch einfach aus, aber so sollte es stimmen.

    Fehlerfrei kompiliert wird es ja, ich hoffe nur, dass es auch fehlerfrei ausgeführt wird. 🙂

    Da kannst du genauso wie beim kompilieren Sicherheit erlangen: Probiers aus. Notfalls mit dem Debugger.


Anmelden zum Antworten