Undefined references



  • Wieso habe ich sie immer in jedem Programm?
    Kann mir jemand sagen, wann die entstehen?

    Habe versucht, Folgendes zu kompilieren:

    // main.cpp
    #include "Tree.h"
    
    int main()
    {
        Tree tree(10);
        tree.print_whole_tree();
        tree.grow(10);
        tree.print_whole_tree();
    }
    
    // Tree.h
    #ifndef TREE_H
    #define TREE_H
    
    class Tree
    {
      private:
        int height, leaves;
        void print_height();
        void print_leaves();
    
      public:
        Tree(int initialHeight);
        ~Tree();
        void print_whole_tree();
        void grow(int years);
    };
    
    #endif
    
    // Tree.cpp
    #include <iostream>
    #include "Tree.h"
    
    namespace std;
    
    Tree::Tree(int initialHeight)
    {
        height = initialHeight;
        leaves = 0;
    }
    
    Tree::~Tree()
    {
        cout << "D E S T R U C T I O N!";
    }
    
    void Tree::print_whole_tree()
    {
    	print_height();
    	print_leaves();
    }
    
    void Tree::print_height()
    {
        cout << height << endl;
    }
    
    void Tree::print_leaves()
    {
        cout << leaves << endl;
    }
    
    void Tree::grow(int years)
    {
        height += years;
        leaves += years*25;
    }
    

    Und ich bekomme immer diese Fehlermeldungen:
    http://www.qpic.ws/images/j4Y68980.jpg

    Alle Dateien liegen im gleichen Ordner.



  • Tja, weil Tree.cpp nicht kompiliert und das Objectfile gegen dein main.cpp-Kompilat gelinkt wurde.
    So geht das:

    $ g++ -c Tree.cpp   # wir wollen nur kompilieren, nicht linken!
    $ g++ Tree.o main.cpp -o main   # kompiliere main.cpp und linke mit Tree.o
    

  • Mod

    Falls einem die Bequemlichkeit vor Kompilierzeit geht, kann man auch einfach folgendes machen (ist jedoch nicht zu empfehlen bei größen Projekten, sondern nur für kleine Testprogramme):

    g++ Tree.cpp  main.cpp -o main   # Kompilieren aller Quelldateien und anschließend alles zusammenlinken
    


  • c++ main.cpp -o MAIN.EXE

    Hier verlangst Du vom Compiler, main.cpp nicht nur zu übersetzen, sondern auch gleich in ein ausführbares Programm zu verwandeln. Du hast hier nur eine Übersetzungseinheit: main.cpp mit den Zeilen aus Tree.h. Die Definitionen für die fehlenden Funktionen stehen allerdings in Tree.cpp drin. Der Compiler weiß das allerdings nicht. Er kompiliert nichts automatisch. Du musst ihm schon sagen, dass er auch Tree.cpp übersetzen soll.

    Versuch's mal in 2 Schritten:

    g++ -c main.cpp
    g++ -c Tree.cpp
    
    g++ -o MAIN.EXE main.o Tree.o
    

    1. Kompilieren
    2. "Linken"

    Gruß,
    SP



  • Kleiner Tipp:
    Arbeite dich in make ein und verwende Makefiles. Hier im Forum gibts sogar ne Vorlage. Das spart nerven. Oder nutze eine IDE. Aber das muss natürlich nicht :).
    Oder nutze andere Buildsysteme wie jam, scons etc.. da gibts viele Alternativen.
    rya.



  • Hm, danke für die Hilfen, aber das scheint auch nicht zu funktionieren ...

    @nichtsnutz:
    Bei dir kommt bei mir:
    http://www.qpic.ws/images/uwu86654.jpg

    @Sebastian Pizer:
    Deins funktioniert auch nicht, dabei kommt:
    http://www.qpic.ws/images/Hmb86774.jpg

    Ich verstehe die Fehlermeldungen nicht; z.B. cout und endl sind doch declared, da ich den Namespace std eingebunden habe, ebenso <iostream> includet.


  • Mod

    C-reator schrieb:

    ...da ich den Namespace std eingebunden habe...

    Hast du nicht. "namespace std;" und "using namespace std;" haben ganz unterschiedliche Bedeutungen.



  • C-reator schrieb:

    @Sebastian Pizer:
    Deins funktioniert auch nicht, dabei kommt:

    > g++ -c main.cpp
    internal error in mingw32_gt_pch_use_address, at [...]
    main.cpp:1: fatal error: had to relocate PCH
    compilation terminated.
    

    Die Fehlermeldung habe ich noch nie vorher gesehen. "internal error" heißt aber meist, dass es sich um einen Bug im Compiler handelt. Es sieht so aus, als hättest Du zwischendurch mal einen Header "kompiliert" (*.gch), der ihm jetzt nicht mehr passt (vielleicht beschädigte Datei?). Guck mal nach, ob du gch-Dateien da rumfliegen hast und wenn ja dann einfach löschen.

    g++ -c soundso.cpp
    

    ist das normalste von der Welt -- muss also klappen, vorausgesetzt, dass soundso.cpp kompilierbar ist. 😉

    Gruß,
    SP



  • Sebastian Pizer schrieb:

    Die Fehlermeldung habe ich noch nie vorher gesehen. "internal error" heißt aber meist, dass es sich um einen Bug im Compiler handelt.

    Hatte so einen Fehler beim Visual Studio schon ein paar mal. Keine Ahnung, was da manchmal falsch läuft, aber meist benötigt es dann einen Neustart der IDE. (und/oder Neukompilierung).

    Habe ich mir eh angewöhnt, bei sehr komischen, exotischen Fehler einfach mal Neu zu erstellen und wenn das nicht hilft mal VS neu starten.
    (siehe z.B 29.9.09 : http://drakon.ch/?id=&offset=1)


Anmelden zum Antworten