undefined reference



  • Hab ich auch:

    Symbol::Symbol(std::string filename)
    {
    	vector<std::string> temp;
    	data=temp;
    }
    

    Hmmm...



  • In 2 verschiedenen Source Dateien? Wenn ja, dann musst du die beiden Source Dateien zusammen linken, da der Linker sonst nicht weiß wo er suchen muss. Wie das geht hängt vom Compiler ab.

    Ansonsten verstehe ich nicht, was dein Ctor machen soll 🙂



  • Die fehlermeldung scheint aber auch für etwas anderes zu stehen

    da ich eine funktion habe bei der er mir genau die selbe fehlermeldung ausgibt

    der witz daran ich habe eine funktion SaveGuestBook();
    die funktioniert die habe ich kopiert und und nur den teil ausgetauscht der daten schreibt gegen das datenlesen und jetzt funktionier das nicht mehr
    und es kommt diese fehlermeldung komischerweise auch ohne zeilennummer

    main.cpp

    ReadGuestBook();
    

    gaestebuch.h

    void ReadGuestBook();
    

    gaestebuch.cpp

    void ReadGuestbook()
    {
    	char * dat_ein;
    	char * token;
    	char sLine[256];
    	char Trenner[] = "|@|";
    
    	dat_ein = "E:\\prog\\src\\Zeile\\Zeile.txt";
    
    	ifstream Datei(dat_ein);
    
    	if ( !Datei )
    	{
    		cout << "Kann Datei ( " << dat_ein << " ) nicht öffnen" << endl;
    	}
    
    	while(!Datei.eof())
    	{
    		Datei.getline(sLine, 256);
    		cout << "Zeile :" << sLine << endl;
    
    		// Zeile auseinandernehmen.
    		token = strtok(sLine, Trenner);
    
    		while( token != NULL )
    		{
    			cout << "Token = " << token << endl;
    
    			token = strtok(NULL, Trenner); 
    		}
    	}
    //	return 0;
    }
    


  • es reicht nicht nur, die readguestbook.h zu includieren in die main.cpp. Wenn du das ganze kompilieren willst, musst du sowohl die main.cpp als auch die readguestbook.cpp gleichzeitig an den compiler schicken bzw. wenn du schrittweise compilierst (also main.o und readguestbook.o als objektdateien kompiliert hast), dann musst du beide objektdateien an den Linker schicken.

    Die hpp zu inkludieren reicht nicht, weil die dem Compiler nur sagt, dass es die Funktion gibt. Aber nicht, wie sie aussieht.



  • Und warum funktioniert das ganze dann mit readguestbook?

    saveguestbook ist eine kopie von readuestbook

    ich habe also einfach alles von readguestbook kopiert und dann read durch save ersetzt und nun meckert er

    wenn der fehler daher kommt wie ihr schreibt warum meckert er dann nicht bei readguestbook

    deswegen meint ich ja die fehlermeldung muss noch für was anderes stehen



  • schreib mal bitte hier hin:

    1. eine Liste deiner Dateien, die du benutzt (die quellcodes sind denke ich mal nicht nötig)

    2. den Compileraufruf, mit dem du den ganzen Krempel compilierst.

    undefined reference heißt einzig und allein, dass der Linker die Definition einer Funktion nicht gefunden hat, die an anderer Stelle aufgerufen wurde. Und da nur der Linker meckert, heißt das, dass die einzelnen cpp's ordentlich compiliert wurden und die Deklaration der Fuktion auch immer schön mit eingebunden worden ist. Es heißt nicht zusätzlich was anderes. Es sei denn du benutzt irgendeinen fragwürdigen kraut-und-rüben-compiler, dessen entwickler so bedeppert waren, mehrdeutuge Fehlermeldungen zu bringen...



  • erstens:
    ja ich benutze einen Kraut und RübenKompiler(IDE)dessen programmierer zu blöd sind
    nämlich DEV-C++ *ironie*

    so da ich ne ide nutze kenn ich den kompiler aufruf nicht

    hier mal den quellcode da beide funktionen ja in der selben datei sind
    und wie gesagt die eine funktion funktioniert die andere nicht

    gaestebuch.cpp

    #include "gaestebuch.h"
    
    void ReadGuestbook()
    {
    	char * dat_ein;
    	char * token;
    	char sLine[256];
    	char Trenner[] = "|@|";
    
    	dat_ein = "E:\\prog\\src\\Zeile\\Zeile.txt";
    
    	ifstream Datei(dat_ein);
    
    	if ( !Datei )
    	{
    		cout << "Kann Datei ( " << dat_ein << " ) nicht öffnen" << endl;
    	}
    
    	while(!Datei.eof())
    	{
    		Datei.getline(sLine, 256);
    		cout << "Zeile :" << sLine << endl;
    
    		// Zeile auseinandernehmen.
    		token = strtok(sLine, Trenner);
    
    		while( token != NULL )
    		{
    			cout << "Token = " << token << endl;
    
    			token = strtok(NULL, Trenner); 
    		}
    	}
    //	return 0;
    }
    
    //------------------------------------------------------------------------------------------
    void SaveGuestBook(struct gBook room)
    {	
    
       time_t rawtime;
       time ( &rawtime );
      room.gDATE = ctime (&rawtime);
    
    //hier wird der Datensatz zusammengestellt als Trennzeichen wird   |@| verwendet
    	string strgMESSAGE = room.gDATE + "|@|" + room.gTITEL + "|@|" + room.gEMAIL + "|@|"+ room.gUSERNAME + "|@|"+ room.gTEXT;
    
          ofstream dat_aus; 
          dat_aus.open("Guestbook/Guestbook.txt", ios_base::app); 
           /*Beretta: Dateiname nun Fest. ios_base::app; neue Daten werden nun angehängt.*/ 
    
                            if(!dat_aus) 
                            { 
                              cout<<"Error, cant find file!"<<endl; 
                            } 
    
                            dat_aus<<strgMESSAGE<<endl; 
                            dat_aus.close(); 
    }
    

    gaestebuch.h

    #ifndef __GAESTEBUCH_H__
    #define __GAESTEBUCH_H__
    
    #include <iostream>							// Include this for the cin/cout classes
    #include <fstream>							// Include this for the ifstream class
    #include <string>							// Include this for the string class
    #include <windows.h>                        // Include this for the WindowsAPI class
    #include <vector>                           // Include this for the vector class
    
    using namespace std;						// Use the standard namespace
    
    struct gBook
    {												
    //Dies sind die benötigten strings fürs Gästebuch
    	string gDATE;				        // 	Datum und Uhrzeit des Eintrages		
    	string gTITEL;					    // 	Titel des Eintrages
    	string gEMAIL;				        //  Die Email der users der den Eintrag vornahm
    	string gUSERNAME;					// 	Den Usernamen der angegeben wurde
    	string gTEXT;					    // 	Dies ist der eingebene Text		
    };
    
    void ReadGuestBook();
    
    void SaveGuestBook(struct gBook);
    
    #endif
    

    und auschnitt aus main.cpp

    [cpp]

    .
    .
    .
    #include "gaestebuch.h"

    .
    .
    .

    else if (r->path_ == "/Guestbook/") {
    title = "Gästebuch";

    body = "<h1>Fill a form</h1>";
    body += "<form action='/Guestbook'>"
    "<table>"
    "<tr><td>Titel</td><td><input name=gTITEL size=\"45\"></td></tr>"
    "<tr><td>E-Mail</td><td height=\"82\"><input name=gEMAIL size=\"45\"></td></tr>"
    "<tr><td>Name</td><td height=\"82\"><input name=gUSERNAME size=\"45\"></td></tr>"
    "<tr><td>Text</td><td><textarea name=\"gTEXT\" cols=\"41\" rows=\"8\"></textarea></td></tr>"
    "</table>"
    "<input type=submit></form>";

    struct gBook room = { "30/02/05", "Das ist Der TITEL", "SKIPPY@GMX:DE", "SKIPPY", "DER Blöde TEXT"} ;

    for (std::map<std::string, std::string>::const_iterator i = r->params_.begin();
    i != r->params_.end();
    i++) {

    body += "<br>" + i->first + " = " + i->second;

    if(i->first == "gTITEL") {room.gTITEL = i->second;}
    if(i->first == "gEMAIL") {room.gEMAIL = i->second;}
    if(i->first == "gUSERNAME") {room.gUSERNAME = i->second;}
    if(i->first == "gTEXT") {room.gTEXT = i->second;}
    }

    ReadGuestBook(); hier taucht dann der fehler auf
    SaveGuestBook(room);

    body += "<hr>" + links;
    }

    .
    .
    .
    [/cpp]



  • [cpp]
    <h1>Fill a form</h1>

    [/cpp]



  • sorry das liegt an den html tags in den jeweiligen strings das forum hat dietrotz das es in c++ code tags ist als html tags interpretiert
    liegt also an der forensoftware



  • ganz banaler typo:

    du hast die Funktion deklariert als void ReadGuestbook, rufst sie aber auf als ReadGuestBook.

    Musst schon auf groß-kleinschreibung achten...



  • @ pumuckl THX

    hast recht schreiben müsste ich können LOL

    darauf muss man als anfänger erstmal kommen das bei einem schreibfehler ne unterschiedliche meldung je nachdem wo er ist Beispiel

    schreibfehler der funktion in der *.h dann kommt irgendwas mit undifinierte function use ...

    schreibfehler in der *.cpp dann undifienierte referenz

    wie ich das allerdings fertig genracht habe bei kopieren und einfügen mit der maus
    die groß und kleinschreibung zu ändern bleibt mir weiterhin schleierhaft

    @Karl Blau vielleicht solltest auch nochmal kontrollieren 🙄


Anmelden zum Antworten