C++ Problem beim Linken



  • maxkla schrieb:

    Hallo, ich bin neu hier und habe ein problem, dass ich schon seit Tagen nicht lösen kann.

    Es handelt sich um ein einfaches Programm, welches einfach nur einen Text ausgibt.
    Dabei verwende ich 3 Dateien nämlich "Main" "Class" und "Implementation". Ich weiß natülich, dass ich den Code direkt über Main ausgeben könnte, aber ich möchte ein bisschen herumprobieren mit Klassen und Objekten und bekomme aber immer den Fehler "undefined reference to". Komischerweise funktioniert es aber, wenn ich die Implementationsdatei weglasse und die Methoden direkt in der Klasse definiere
    ...hat jemand eine Idee wie ich das lösen kann? 😞

    schwierig so zu sagen klingt aber so als wenn du nicht richtig linkst...

    welche ide benutzt du ?
    wie compilierst du ?
    hast richtig gelinkt? ( siehe Option "-l" beim compilieren... )

    schau mal hier ein ähnliches problem aus dem forum: (nur hier opencv)
    https://www.c-plusplus.net/forum/279664-full

    lg



  • Ich verwende den GNU Compiler und verwende CodeBlocks als IDE. Habe auch alle Einstellungen bzgl. Compiler und Linker so eingestellt, wie ihm Buch "Der C++ Programmierer" vorgeschrieben und habe trotzdem diesen komischen Fehler, auch bei den Lösungen aus dem Buch?!



  • Zeig doch mal den vollständigen Fehler (kopiert). Wir wissen immernoch nicht was er nicht linken kann.
    Außerdem code dazu.
    Sind alle Dateien dem C::B Projekt hinzugefügt? Wenn nicht alle Source kompiliert werden, kann er auch nicht linken.



  • Hier ist der Fehlercode: "|undefined reference to `Datei::Datei(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'|
    ||error: ld returned 1 exit status|
    ||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|"

    Das Programm soll einen Text in einer Datei speichern.
    Hier noch der Programmcode:

    //main
    #include <iostream>
    #include "test.h"

    using namespace std;

    int main(){
    Datei objekt("test.txt");
    }

    //Klasse
    #ifndef TEST_H
    #define TEST_H
    #include <fstream>

    class Datei
    {

    public:

    Datei (std::string name);
    };

    #endif

    //Implementation
    #include "test.h"
    #include <string>

    Datei::Datei(std::string name)
    {
    std::ofstream datei(name);
    datei << "Hallo ich bin eine Testdatei";
    }

    Hoffentlich ist kein peinlicher Fehler dabei 🕶



  • Deine Datei mit der Implementation von Datei::Datei wird offensichtlich nicht dazu gelinkt. Ist diese Datei Teil des Projekts? Bei *.cpp Dateien muss deine IDE alle Dateien compilieren und später zusammen linken. Das geht natürlich nur wenn diese bekannt sind. Header werden dagegen auch so gefunden wenn sie im gleichen Ordner liegen.



  • Also mir fällt auf, dass du in der .cpp Datei <string> inkludiert hast. Obwohl du es aber schon im Header der Klasse benutzt also in der .h Datei.
    Ich würde bei Klassen alles was du inkludierst schon im Header angeben.



  • Aja, das mit dem String ist mir auch grad aufgefallen..ich bin einfach bei CodeBlocks auf Source File gegangen und hab danach eine Klasse erstellt (alles im selben Ordner) war das falsch?



  • Problem wurde gelöst...dateien waren einfach nicht im gleichen projekt und desshalb hat er sie nicht gefunden!
    Danke an euch!



  • Hast du das was ich dir gesagt habe geändert? Würde mich mal interessieren ob das auch so geht, wie du es zuerst versucht hast.
    Ich meine das mit dem String inkludieren. Hab jetzt doch Projekte gesehen, wo viel in der .cpp Datei inkludiert wurde. Dachte immer es wäre besser wenn man sowas immer in die Header Datei packt.



  • Bennisen schrieb:

    Hab jetzt doch Projekte gesehen, wo viel in der .cpp Datei inkludiert wurde. Dachte immer es wäre besser wenn man sowas immer in die Header Datei packt.

    Meine Regel dazu ist nur das nötigste in den Header zu packen und wenns geht Forward Declarations für eigene Klassen zu nutzen. In seinem Beispiel würde der Header also nur den string Header laden, weil das direkt für die Deklarationen der Funktionen gebraucht wird. Aber den fstream Header würde ich in die cpp Datei packen, weil dieser nur dort gebraucht wird. Wenn man alles in die Header packt zieht man sich nacher die halbe STL in jede cpp Datei und die Compilezeit wird länger. Durch die Forward Declarations verringert man auch die Abhängigkeiten zwischen den Headern.



  • Bennisen schrieb:

    Hast du das was ich dir gesagt habe geändert?
    Würde mich mal interessieren ob das auch so geht, wie du es zuerst versucht hast.
    Ich meine das mit dem String inkludieren. Hab jetzt doch Projekte gesehen, wo viel in der .cpp Datei inkludiert wurde. Dachte immer es wäre besser wenn man sowas immer in die Header Datei packt.

    meiner meinung nach kommt das darauf an wo du die header benutzt/benötigst.
    wenn du sie in deinem "eigenen erstellten" header benutzt dann dort wenn du sie nur in der .cpp brauchst dann halt da.

    also zumindest mach ich das immer so, hat meiner meinung nach auch den vorteil das ich oben sehe welche header ich benutzt habe... 🙄

    außerdem musst ja nix inkluden was nicht gebraucht wird 😉 ...
    (bzw. warum solltest das tun?)

    lg


Anmelden zum Antworten