Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Linkerproblem: "undefined reference to"

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
17.03.2005, 22:03 Uhr
~Solour
Gast


hi,

ich hab da ein linker problem..:/


Code:
D:\ListC>g++ -o main.exe main.o
main.o(.text+0x603):main.cpp: undefined reference to `Element::maxLength'
main.o(.text+0x613):main.cpp: undefined reference to `Element::maxLength'
main.o(.text+0x626):main.cpp: undefined reference to `Element::maxLength'
main.o(.text+0x670):main.cpp: undefined reference to `Element::maxLength'
main.o(.text+0x6fa):main.cpp: undefined reference to `Element::maxLength'
main.o(.text+0x74d):main.cpp: more undefined references to `Element::maxLength'
follow
collect2: ld returned 1 exit status



beim compilieren gibt es keine besonderen warnungen o.ä.
ich benutze die aktuelle MinGW-Version
hab schon gegoogled und bei anderen problemen mit selben fehler war es wie ich vermute compiler/OS abhängig ob der code verlinkt werden konnte
allgemeine tipps zum code nehm ich aber auch gern an

der code:
main.cpp

Code:
#include <stdio.h>
#include "log.cpp"
#include "list.cpp"

#define MAIN_VERSION 0
#define APP_TITLE "ListTest"

int main(int argc, char* argv[]){
    cout << APP_TITLE"\n";
    
    Log logObj("logFile.txt", "errFile.txt");
    
    logObj.pLn("test1");
    logObj.logLn("test2");
    logObj.logLn("test3");
    logObj.logLn("test4");
    
    List xl;
    Element elem("value1");
    xl.pushFront(&elem);
    cout << (*(xl.popBack())).getValue();
    //block until user types something
    fgetc(stdin);
    return 0;
}



element.cpp

Code:
#include <string.h>

class Element{
    private:
        Element *next;
        Element *prev;
        char value[];
        static int maxLength;
    public:
        Element();
        Element(char value[]);
        void setPrev(Element *p);
        Element* getPrev();
        void setNext(Element *n);
        Element* getNext();
        void setValue(char val[]);
        char* getValue();
        int compareTo(char value2[]);
        static void swapElems(Element *e1, Element *e2);
};

Element::Element(){
    maxLength= 255;
}

Element::Element(char value[]){
    maxLength= 255;
    setValue(value);
    setNext(NULL);
    setPrev(NULL);
}

void Element::setPrev(Element *p){
    prev= p;
}

Element* Element::getPrev(){
    return prev;
}

void Element::setNext(Element *n){
    next= n;
}

Element* Element::getNext(){
    return next;
}

void Element::setValue(char val[]){
    if(strlen(value)>maxLength)
        strcpy(value, "");
    else
        strcpy(value, value);
}

char* Element::getValue(){
    return value;
}

int Element::compareTo(char value2[]) {
    return strcmp(value,value2);
}

void Element::swapElems(Element *e1, Element *e2){
    char tmp[maxLength];
    strcpy(tmp, (*e1).getValue());
    (*e1).setValue((*e2).getValue());
    (*e2).setValue(tmp);
}



list.cpp

Code:
#include <iostream.h>
#include <fstream.h>
#include "element.cpp"

class List{
    private:
        Element *first;
        Element *last;
        int size;
    public:
        List();
        ~List();
        void pushFront(Element *elem);
        void pushBack(Element *elem);
        Element* popFront();
        Element* popBack();
        //Element topFront();
        //Element topBack();
        //void addList(List *list);
        //void addArray(Element *elems[]);
        //void quickSort();
        //void cls();
        //char* toString();
        //bool isEmpty();
        //int getSize();
        //bool equal();
};

// constructor
List::List(){
    first= NULL;
    last= NULL;
    size= 0;
}

// destructor
List::~List(){
    first= NULL;
    last= NULL;
    size= 0;
}

void List::pushFront(Element *elem){
    if(first==NULL){
        first= elem;
        last= elem;
        (*elem).setNext(NULL);
        (*elem).setPrev(NULL);
        return;
    }
    (*elem).setNext(first);
    (*first).setPrev(elem);
    (*elem).setPrev(NULL);
    first= elem;
    size++;
}

void List::pushBack(Element *elem){
    if(first==NULL){
        first= elem;
        last= elem;
        (*elem).setNext(NULL);
        (*elem).setPrev(NULL);
        return;
    }
    (*first).setNext(elem);
    (*elem).setPrev(first);
    (*elem).setNext(NULL);
    last= elem;
    size++;
}

Element* List::popFront(){
    if(size==0)
        return NULL;
    Element *result= first;
    if(size==1){
        first= NULL;
        last= NULL;
    }else{
        first= (*first).getNext();
        (*first).setPrev(NULL);
    }
    (*result).setNext(NULL);
    (*result).setPrev(NULL);
    return result;
}

Element* List::popBack(){
    if(size==0)
        return NULL;
    Element *result= last;
    if(size==1){
        first= NULL;
        last= NULL;
    }else{
        last= (*last).getPrev();
        (*last).setNext(NULL);
    }
    (*result).setNext(NULL);
    (*result).setPrev(NULL);
    return result;
}



log.cpp

Code:
#include <iostream.h>
#include <fstream.h>

class Log{
    private:
        char logFile[255];
        char errFile[255];
    public:
        Log(char* logFile, char* errFile);
        ~Log();
        char* getLogFile();
        char* getErrFile();
        void setLogFile(char logF[]);
        void setErrFile(char errF[]);
        
        void p(char msg[]);
        void pLn(char msg[]);
        void log(char msg[]);
        void logLn(char msg[]);
        void err(char msg[]);
        void errLn(char msg[]);    
};

// constructor
Log::Log(char logF[255], char errF[255]){
    setLogFile(logF);
    setErrFile(errF);
}

// destructor
Log::~Log(){
    // empty destructor
}

// getter methods
char* Log::getLogFile(){
    return logFile;
}

char* Log::getErrFile(){
    return errFile;
}

// setter methods
void Log::setLogFile(char logF[]){
    strcpy(logFile, logF);
}

void Log::setErrFile(char errF[]){
    strcpy(errFile, errF);
}

// console output, no logging
void Log::p(char msg[]){
    cout << msg;
}

void Log::pLn(char msg[]){    
    char tmp[strlen(msg)+2];
    strcpy(tmp, msg);
    p(strcat(tmp, "\n"));
}

// no console output, logging only to logFile
void Log::log(char msg[]){
    fstream file_op(logFile, ios::out|ios::app);
    if(file_op.is_open()){
        file_op << msg;
        file_op.close();
    }else
        errLn("[Log][Error] : Could not open logFile.");
}

void Log::logLn(char msg[]){
    char tmp[strlen(msg)+2];
    strcpy(tmp, msg);
    log(strcat(tmp, "\n"));
}

// no console output, logging only to errFile
void Log::err(char msg[]){
    fstream file_op(errFile, ios::out|ios::app);
    if(file_op.is_open()){
        file_op << msg;
        file_op.close();
    }else
        cout << "[Log][Error] : Could not open errFile.";
}

void Log::errLn(char msg[]){
    char tmp[strlen(msg)+2];
    strcpy(tmp, msg);
    err(strcat(tmp, "\n"));
}



gratz
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.03.2005, 10:03 Uhr
Th



Einfach in der Element.cpp die Variable "maxLength" anlegen.

C++:
int Element::maxLength = 255;


Die Initialisierung kann auch entfallen, dann wird es automatisch auf Null (0) gesetzt.

Eine statische Variable solltest du aber nicht im Konstruktor setzen, da sie ja global für alle Instanzen ist und außerdem existiert, ohne daß eine Instanz der Klasse existieren muß.

P.S. Warum benutzt du nicht die "std::string"-Klasse?

Dieser Post wurde am 18.03.2005 um 10:04 Uhr von Th editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.03.2005, 10:20 Uhr
Airdamn



Normalerweise solltest Du nicht die .cpp-Dateien includen, sondern die .h-Dateien!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.03.2005, 10:28 Uhr
Th



So wie es aussieht, hat "Solour" nur cpp-Dateien erstellt.
Solour, du solltest deine Dateien, so wie Airdamn geschrieben hat, in .h und .cpp aufteilen, wobei du in den Header-Dateien nur Deklarationen einfügst, und in den cpp-Dateien den zugehörigen Quellcode.
Außerdem solltest du die richtigen System-Header einbinden (die ohne .h), also

C++:
#include <iostream>
#include <fstream>


und nicht die alten C-Header wie "<stdio.h>".

Wundert mich, daß dein Compiler somit auf "cout" zugreifen kann.
Oh, habe gerade gesehen, daß ja über "List.cpp" die "iostream" inkludiert wird (sehr sehr unschöner Stil!!!).

Dieser Post wurde am 18.03.2005 um 10:30 Uhr von Th editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.03.2005, 16:01 Uhr
~Solour
Gast


HI

schonmal vielen dank für die hilfe!!
hab mich jetzt doch für std:string entschieden..
aber: wenn ich

Code:
#include <iostream>
#include <fstream>


benutze dann sind cout und fstream in der log.cpp undeclared?

wie kann ich die denn dann weiterbenutzen? oder welche alternativen habe ich??

bis dann
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.03.2005, 16:04 Uhr
Oliver
S2-Pixelgeneral


Die sind dann alle im std Namespace, also entweder:


C++:
using namespace std;



oder


C++:
std::cout << "sdkjsdkfj";
std::fstream fstr;
fstr<<"sdfjk";
fstr.close();


--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
19.03.2005, 15:06 Uhr
~Solour
Gast


das mit cout scheint zu klappen aber ich hab probleme mit dem fstream...

Code:
log.cpp: In member function `void Log::log(std::string)':
log.cpp:47: error: no matching function for call to `std::basic_fstream<char, st
d::char_traits<char> >::basic_fstream(std::string&, std::_Ios_Openmode)'
C:/Programme/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/io
sfwd:96: note: candidates are: std::basic_fstream<char, std::char_traits<char> >
::basic_fstream(const std::basic_fstream<char, std::char_traits<char> >&)
C:/Programme/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/fs
tream:772: note:                 std::basic_fstream<_CharT, _Traits>::basic_fstr
eam(const char*, std::_Ios_Openmode) [with _CharT = char, _Traits = std::char_tr
aits<char>]
C:/Programme/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/fs
tream:758: note:                 std::basic_fstream<_CharT, _Traits>::basic_fstr
eam() [with _CharT = char, _Traits = std::char_traits<char>]
log.cpp: In member function `void Log::logLn(std::string)':
log.cpp:56: error: expected `;' before ')' token
log.cpp: In member function `void Log::err(std::string)':
log.cpp:61: error: no matching function for call to `std::basic_fstream<char, st
d::char_traits<char> >::basic_fstream(std::string&, std::_Ios_Openmode)'
C:/Programme/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/io
sfwd:96: note: candidates are: std::basic_fstream<char, std::char_traits<char> >
::basic_fstream(const std::basic_fstream<char, std::char_traits<char> >&)
C:/Programme/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/fs
tream:772: note:                 std::basic_fstream<_CharT, _Traits>::basic_fstr
eam(const char*, std::_Ios_Openmode) [with _CharT = char, _Traits = std::char_tr
aits<char>]
C:/Programme/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/fs
tream:758: note:                 std::basic_fstream<_CharT, _Traits>::basic_fstr
eam() [with _CharT = char, _Traits = std::char_traits<char>]

D:\workspace\ListC>C:\Programme\MinGW\bin\g++ -c main.cpp
main.cpp: In function `int main(int, char**)':
main.cpp:22: error: `cout' undeclared (first use this function)
main.cpp:22: error: (Each undeclared identifier is reported only once for each f
unction it appears in.)



der code an der stelle sieht jetzt so aus:

Code:
void Log::log(std::string msg){
    std::fstream file_op(logFile, ios::out|ios::app);
    if(file_op.is_open()){
        file_op << msg;
        file_op.close();
    }else
        errLn("[Log][Error] : Could not open logFile.");
}



vorher hatte ja eigentlich alles funktioniert gehabt

greetings
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
19.03.2005, 15:12 Uhr
Oliver
S2-Pixelgeneral


Mach noch vor ios::out etc. ein std:: :


C++:
std::ios::out|std::ios::app


--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
19.03.2005, 15:15 Uhr
Solour



ne daran liegts net, zumidnest nicht allein... leider
kommt dann zumidnest wieder ne fehlermeldung: für mich ist die recht kryptisch :p

Code:
D:\workspace\ListC>C:\Programme\MinGW\bin\g++ -c log.cpp
log.cpp: In member function `void Log::log(std::string)':
log.cpp:47: error: no matching function for call to
        `std::basic_fstream<char, std::char_traits<char> >::basic_fstream(std::string&, std::_Ios_Openmode)'
C:/Programme/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/iosfwd:96:
        note: candidates are:
        std::basic_fstream<char, std::char_traits<char> >::basic_fstream(const std::basic_fstream<char, std::char_traits<char> >&)
C:/Programme/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/fstream:772:
        note:
        std::basic_fstream<_CharT, _Traits>::basic_fstream(const char*, std::_Ios_Openmode)
        [with _CharT = char, _Traits = std::char_traits<char>]
C:/Programme/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/fstream:758:
        note:
        std::basic_fstream<_CharT, _Traits>::basic_fstream()
        [with _CharT = char, _Traits = std::char_traits<char>]


trotzdem thx fürn versuch!

Dieser Post wurde am 19.03.2005 um 15:18 Uhr von Solour editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
19.03.2005, 18:07 Uhr
Solour



hi,

ich glaub das liegt daran das logFile nen std:string ist aber nen char* erwartet wird?
nun müsst ich nur korrekt aus dem string diesen char* machen :p?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: