Anfänger verzweifelt an "collect2: ld returned 1 exit status" - Fehler



  • Hallo liebe C++ - Gemeinde,

    ich sitze nun wieder mal vor meinen HA's für die Uni. Diesmal dreht sich unsere HA um Klassen und Objekte bzw. Dateien einlesen und schreiben.

    Die Aufgabe dazu lautet:

    Schreiben Sie ein Programm zur Verwaltung von Bus- und Straßenbahnlinien. Jede Linie umfasst Nummer (als Zahl), Typ (Bus oder Bahn), Endstationen und Fahrzeit. Folgende Teilaufgaben sind zu implementieren:

    * Lesen aus Datei,
    * Anzeige der Linien,
    * Erfassen neuer Linien,
    * Löschen von Linien über Angabe der Liniennummer,
    * Speichern der Linien beim Beenden des Programms.

    So naja ich habe dazu folgendes Programm im QT Creator geschrieben (als Download: Mein C++ - Projekt).

    Naja ich erhalte jedenfalls beim Kompilieren diese Fehlermeldung:

    collect2: ld returned 1 exit status
    

    Der Fehler muss in einer von diesen drei Dateien liegen...mein Gefühl sagt mir in der linienbearbeitung.cpp, aber ich finde ihn nicht 😞 .

    Hier die drei Dateien:
    main.cpp:

    #include <iostream>
    #include <fstream>
    #include <tokenizer.h>
    #include <linienbearbeitung.h>
    
    void listeanzeigen () {
        std::string zeile;
        std::string abschnitt;
        std::ifstream bubaliste("bubaliste.dat");
        while (getline(bubaliste, zeile)) {
            if (zeile[0]=='#') continue;
            Tokenizer tok(zeile, '^');
            while (tok.anymore()) {
                abschnitt = tok.next();
                std::cout<<abschnitt<<" ";
            }
            std::cout<<std::endl;
        }
    }
    
    int main() {
    
        Linienbearbeitung bubanew(0);
        //->Verwaltungsprogramm
          int aufg = 0;
          while (aufg != 4) {
          std::cout<<"\nAufgabenmanager\n---------------"<<std::endl;
          //Auswahl
          std::cout<<"Druecken sie die"<<std::endl;
          std::cout<<"1 - Zum Anzeigen Bus- und Bahnliste"<<std::endl;
          std::cout<<"2 - Zum Linien hinzufuegen"<<std::endl;
          std::cout<<"3 - Zum Linien loeschen"<<std::endl;
          std::cout<<"4 - Zum Programm beenden"<<std::endl;
          std::cout<<std::endl;
          std::cout<<"Was moechten sie tun?";
          std::cin>>aufg;
          std::cout<<std::endl;
    
          switch (aufg) {
          case 1:
            std::cout<<"Aktuelle Bus- und Bahnliste:"<<std::endl;
                listeanzeigen();
                break;
          case 2:
            std::cout<<"Fügen Sie neue Linie hinzu."<<std::endl;
                bubanew.bubaadd();
                break;
          case 3:
            std::cout<<"Loeschen Sie eine Linie."<<std::endl;
                bubanew.bubadel();
                break;
          case 4:
            std::cout<<"-->Programm wurde beendet!";
                break;
          default:
            std::cout<<"--->!!!Ungueltige Eingabe!!!<---"<<std::endl;
                std::cout<<">Bitte probieren sie es erneut.<"<<std::endl;
                break;
          }
          }
    
        return 0;
    }
    

    linienbearbeitung.h:

    #ifndef LINIENBEARBEITUNG_H
    #define LINIENBEARBEITUNG_H
    #include <string>
    
    class Linienbearbeitung
    {
        private:
            std::string myBubanummer;
            std::string myBubatyp;
            std::string myBubaziel;
            std::string myBubazeit;
        public:
            Linienbearbeitung(int a);
            bool doubletest(std::string nummer);
            void bubaadd();
            void bubadel();
    
    };
    
    #endif // LINIENBEARBEITUNG_H
    

    linienbearbeitung.cpp:

    #include <linienbearbeitung.h>
    #include <fstream>
    #include <tokenizer.h>
    #include <iostream>
    
    Linienbearbeitung::Linienbearbeitung(int a)
    {a=0;}
    
    //Duplikatetest
    bool doubletest(std::string nummer){
        std::ifstream bubaliste("bubaliste.dat");
        std::string dateizeile;
        while (getline(bubaliste, dateizeile)) {
            if (dateizeile[0]=='#') continue;
            Tokenizer tok(dateizeile, '^');
            if(tok.next() == nummer) return true;
        }
        return false;
    }
    
    void Linienbearbeitung::bubaadd(){
        //Eingabe
        std::cout<<"Neue Liniennummer:";
        std::cin>>myBubanummer;
        std::cout<<"Bus oder Bahn:";
        std::cin>>myBubatyp;
        std::cout<<"Endhaltestelle:";
        std::cin>>myBubaziel;
        std::cout<<"Fahrtzeit:";
        std::cin>>myBubazeit;
    
        //Duplikate überprüfen
        if (doubletest(myBubanummer)) {
            std::cout<<"Die Liniennummer existiert schon!"<<std::endl;
        }
        //In Datei schreiben
        else {
        std::ofstream hinzufug("bubaliste.dat", std::ios_base::app);
        hinzufug<<myBubanummer<<"^"<<myBubatyp<<"^"<<myBubaziel<<"^"<<myBubazeit<<"\n";
        hinzufug.close();
        }
    }
    
    void Linienbearbeitung::bubadel() {
        std::string delNummer;
        std::string::size_type delPos1;
        std::string::size_type delPos2;
        std::string dateiinhalt;
        std::string dateizeile;
    
        //Eingabe
        std::cout<<"Welche Liniennummer möchten sie loeschen: ";
        std::cin>>delNummer;
    
        //Test ob vorhanden + löschen
        if (doubletest(delNummer)) {
            std::ifstream bubaliste("bubaliste");
            while (getline(bubaliste, dateizeile)) {
                if (dateizeile[0]=='#') continue;
                dateizeile = std::string(dateizeile)+"\n";
                dateiinhalt = dateiinhalt+dateizeile;
            }
    
            delPos1 = dateiinhalt.find(delNummer, 0);
            delPos2 = dateiinhalt.find("\n", delPos1);
            dateiinhalt.erase(delPos1, (delPos2+1)-delPos1);
    
            std::ofstream dateiinhaltNew("bubaliste.dat");
            dateiinhaltNew<<dateiinhalt;
            dateiinhaltNew.close();
        }
        else std::cout<<"Die Liniennummer existiert nicht!"<<std::endl;
    }
    

    Naja hab auch schon gegoogelt, aber nix außer für mich noch kryptischen Zeugs gefunden. 😞

    Ich bedanke mich schon mal für jede Hilfe...

    Beste Grüße,
    Chillee



  • Chillee schrieb:

    Naja ich erhalte jedenfalls beim Kompilieren diese Fehlermeldung:

    collect2: ld returned 1 exit status
    

    Das sagt nur, dass ein Fehler aufgetreten ist. Welcher, steht weiter oben.



  • Das ist ein Linkerfehler. Die häufigsten Linkerfehler sind "unresolved symbol", d.h. dass irgendwas zwar deklariert wurde (d.h. der Compiler kennt es) aber nicht implementiert. Bei dir dürfte es sich um die Funktion doubletest handeln. Du hast sie als Memberfunktion deklariert, aber als freie Funktion definiert. Für den Compiler und den Linker sind das zwei völlig verschiedene Funktionen. Vielleicht ist es noch was anderes, aber das fällt erstmal ins Auge.



  • Erstmal vielen Dank!

    ...haha ich lach mich kaputt, während ich hier eigentlich etwas total anderes schreiben wollte, ist mir durch Bashar's Antwort die Lösung gekommen 🙂 !

    Also DANKE DANKE DANKE 🙂 🙂 :)....

    Mein Verdacht war auch der doubletest, aber ich war gestern Abend/Nacht einfach zu blind meine Tippfehler zu sehen.

    Also in der linienbearbeitung.cpp musste ich folgendes Ändern:

    //Duplikatetest
    bool Linienbearbeitung::doubletest(std::string nummer){ //---> Hier habe ich nur Linienbearbeitung:: eingefügt
        std::ifstream bubaliste("bubaliste.dat");
        std::string dateizeile;
        while (getline(bubaliste, dateizeile)) {
            if (dateizeile[0]=='#') continue;
            Tokenizer tok(dateizeile, '^');
            if(tok.next() == nummer) return true;
        }
        return false;
    }
    

    nun läuft es soweit 🙂 !

    Ihr seit klassse...wünsche euch schöne Weihnachten und dann einen besinnlichen 4.Advent!

    Viele Weihnachtsgrüße,
    Chillee


Anmelden zum Antworten