undefined reference to



  • hey ich hab ein probelm ich bekomm immer diesen fehler:

    CMakeFiles/CPU.dir/cpu.cpp.o: In function `main':
    cpu.cpp:(.text+0xe9): undefined reference to `HTML_File::add_text(char const*)'
    cpu.cpp:(.text+0x102): undefined reference to `HTML_File::add_verbatim(std::basic_istream<char, std::char_traits<char> >&)'
    

    ich hab 3 datei:
    cpu.h //meine header
    cpu2.cpp //hier sind meine funktionen drin
    cpu.cpp //meine main

    hab in der header #define CPU_H drin
    und in der cpu.cpp und cpu2.cpp dann #include cpu.h

    liegts an dem oder ist das irgentwas anderes?

    schonmal danke 🙂



  • Was ist denn HTML_file ? Kommt die Klasse von dir oder ist sie Bestandteil einer Bibliothek. Im ersten Fall musst du die entsprechenden .h/.cpp Dateien mit in dein Projekt aufnehmen, im zweiten musst du deinem Linker mitteilen, dass er beim Linken die Bibliothek mitlinken soll.



  • DocShoe schrieb:

    Was ist denn HTML_file ? Kommt die Klasse von dir oder ist sie Bestandteil einer Bibliothek. Im ersten Fall musst du die entsprechenden .h/.cpp Dateien mit in dein Projekt aufnehmen,

    wie nehm ich den die .cpp mit auf?

    im zweiten musst du deinem Linker mitteilen, dass er beim Linken die Bibliothek mitlinken soll.

    bitte was? 🙂 versteh ich nicht



  • ach so und html_file is meine klasse hab ich im header drin



  • Ist die komplette Klasse im Header oder ist sie verteilt auf Header und cpp-Datei?



  • _matze schrieb:

    Ist die komplette Klasse im Header oder ist sie verteilt auf Header und cpp-Datei?

    verteilt

    wenn ich nun in meine cpumain.cpp #include "cpu.cpp" rein schreibe kommt dieser fehler hier:
    /home/praktikant/kernelstat/cpu2.cpp: In Funktion »void add_verbatim(std::istream&)«:
    /home/praktikant/kernelstat/cpu2.cpp:8:5: Fehler: »data« wurde in diesem Gültigkeitsbereich nicht definiert
    /home/praktikant/kernelstat/cpu2.cpp: In Funktion »void add_text(const char*)«:



  • also wenn ich das richtig entnommen habe hier:
    http://www.c-plusplus.net/forum/301348-full

    dann fehlt mir da was in der cmakelist.txt richtig?



  • *.cpp werden nicht includiert.
    übersetzte die beiden cpp-dateien in einem g++ aufruf.

    informier dich über übersetzungseinheiten, beispielsweise bei volkard

    http://www.iks.hs-merseburg.de/~kilian/ak_Dateien/ak_lehre_Dateien/2011_SS/Bioinformatik_VL/Lehrmaterial/C++/Kurs Volkhard Henkel/html/uebersetzungseinheiten.html

    (ignoriere hier jedoch das void main... nicht standard)



  • Enno schrieb:

    dann fehlt mir da was in der cmakelist.txt richtig?

    Was steht denn in deiner cmakelist.txt? Meine Kristallkugel ist gerade in der Werkstatt.



  • cmake_minimum_required(VERSION 2.8.7)
    project(CPU)
    
    set(CPU_VERSION_MAJOR 1)
    set(CPU_VERSION_MINOR 0)
    
    add_executable(CPU cpumain.cpp)
    

    und meine header:

    #ifndef CPU_H
    #define CPU_H
    
    class HTML_File 
    { 
    private: 
      std::string data;  
    public: 
    
      void add_verbatim(std::istream& in); 
      void add_text(const char *in); 
      std::string to_string();
    
    };  
    #endif
    


  • Enno schrieb:

    add_executable(CPU cpumain.cpp)

    Was ist denn cpumain.cpp? Die hast du vorher nicht erwähnt.

    Wie auch immer, in diese runde Klammer müssen alle .cpp-Dateien, die zum Programm gehören.



  • Da fehlt übrigens ein #include <string> in deinem Header über der Klassendefinition.

    Schau mal in ein Grundlagenbuch über C++ deiner Wahl nach, wie das mit der getrennten Übersetzung und der ODR (one definition rule) funktioniert.



  • ups entschuldige
    ich hab meine datei eben umbenannt zu besseren übersicht

    hab nun:
    cpumain.cpp
    cpu.h
    cpu.cpp

    d.h. nun muss ich die cpu.cpp auch da mit rein machen? also
    add_executable(CPU cpumain.cpp, cpu.cpp)???



  • Enno schrieb:

    d.h. nun muss ich die cpu.cpp auch da mit rein machen? also
    add_executable(CPU cpumain.cpp, cpu.cpp)???

    Ja sicher! ...wobei da glaub'ich kein Komma hinkommt.



  • yeah das hat geholfen 😃

    kommt das nächste problem:

    /home/praktikant/kernelstat/cpu.cpp: In Funktion »void add_verbatim(std::istream&)«:
    /home/praktikant/kernelstat/cpu.cpp:8:5: Fehler: »data« wurde in diesem Gültigkeitsbereich nicht definiert
    

    hab auch schon probiert das std::string data; in public mit rein zu hauen geht auch nicht

    class HTML_File 
    { 
    private: 
      std::string data;  
    public: 
    
      void add_verbatim(std::istream& in); 
      void add_text(const char *in); 
      std::string to_string();
    
    };
    
    #include <fstream> 
    #include <iostream> 
    #include <ostream>
    #include <string> 
    #include "cpu.h"
    
      void add_verbatim(std::istream& in) {
        data += "<pre>"; 
        char c; 
        while(in.get(c)) 
          if (c == '<') data += "&lt"; 
          else 
            if (c == '>') data += "&gt"; 
            else 
              data += c; 
        data += "</pre>"; 
      } 
    
      void add_text(const char *in) { 
        data += in; 
      } 
    
      std::string to_string(){ 
        std::string out = 
          "<!DOCTYPE html>\n<html><body>" 
          + data 
          + "</body></html>\n"; 
        return out; 
      }
    

    oder muss ich hier nochmal

    char data
    

    einfügen?



  • void HTML_File::add_verbatim(std::istream& in) {
    ...
    


  • wow danke 🙂

    nur wie mach ich es heir mit?

    std::string to_string(){
    

    schreib ich HTML_File davor bekomm ich ein fehler



  • ok bin dumm xD hat sich erledigt


Anmelden zum Antworten