Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » [Problem] 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 <
000
04.05.2004, 19:19 Uhr
DerSchwarzeSchlumpf



hi :)

hab mein c++-programm vollkommen in MS Studio.net geschrieben und dort compiliert es ohne Probleme, Warnings oder Fehlermeldungen und funktioniert auch super.

Das Problem ist: Als Referenzstation für das Testen des Programmes wird der GNU-Compiler verwendet. Doch wenn ich hier die einzelnen .cpp-Files inkludiere, bricht er immer mit unterschiedlichen Fehlermeldungen ab:

"Undefined Reference *bestimmte Methode*"

beispielcode:
C:\Programme\Cygwin\bin>g++ c:\temp\labyrinth\define_labyrinth.cpp /cygdrive/c/DOKUME~1/Master/LOKALE~1/Temp/ccL1zVlP.o(.text+0x16d):define_labyrinth.cpp: undefined reference to `Matrix::setMatrixBool(bool, unsigned, unsigned)

einmal davon abgesehen dass ich (totaler c++-anfänger) keine ahnung habe woher die fehlermeldung kommt *g* (schätze aber mal es ist der linker der keine ahnung hat wo er die zugehörige methode findet?) hab ich noch weniger plan wie ich das jetzt beheben kann... . die eingebundenen .h-files hab ich selbstverständlich mit dem #ifnef ausgestattet. beispiel.


C++:
#ifndef define_labyrinth_h__
#define define_labyrinth_h__

#include "finish_point.h"
#include "start_point.h"
#include "matrix.h"
#include "output_elements.h"
#include "input_elements.h"
#include "matrix_valiador.h"
#include "define_labyrinth.h"
#include "matrix_valiador.h"


class DefineLabyrinth
{
  public:
    DefineLabyrinth();
    ~DefineLabyrinth();

    void startLabyrinthDefine(Matrix* matrix, StartPoint* start_point,
                              FinishPoint* finish_point,InputElements* input_elements,
                              MatrixValiador *matrix_valiador);

    void calculateUnsignedIntegers(char* my_matrix_coordinates, Matrix* matrix,
                                   StartPoint* start_point, FinishPoint* finish_point,
                                   InputElements* input_elements,
                                   MatrixValiador *matrix_valiador);
  
    void preDefineMatrix(unsigned column, unsigned row, Matrix* matrix,
                         StartPoint* start_point, FinishPoint* finish_point,
                         InputElements* input_elements, MatrixValiador *matrix_valiador);

    void getLineLabyrinth(unsigned row_counter, Matrix* matrix, StartPoint* start_point,
                          FinishPoint* finish_point, InputElements* input_elements);

    void columnHandler(char *labyrinth_line, unsigned row_counter, Matrix *matrix,
                       StartPoint *start_point, FinishPoint *finish_point,
                       InputElements *input_elements);

    unsigned getUserSignIdentification(char input_variable, InputElements *input_elements);
};

#endif



könnte es daran liegen, dass ich gewisse .h-files sowohl im .cpp als auch im dazugehörigen .h eingebunden habe? zB matrix.h sowohl im define_labyrinth.cpp und define_labyrinth.h (weil ich bei der übergabe der parameter die klasse brauche). glaube aber dass das eher nichts damit zu tun haben kann (dank des #ifndef, oder)?

wär über hilfe echt dankbar *g*

lg

Dieser Post wurde am 04.05.2004 um 21:19 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.05.2004, 21:24 Uhr
Pablo
Supertux
(Operator)


Du musst dem g++ auch mitteilen, wo die Funktion Matrix::setMatrixBool implementiert wurde (d.h. wo der Code und Rumpf der Funktion steht) sonst kann der Linker sie nicht finden, der Linker ist Linker und nicht Hellseher. Angenommen, Matrix::setBool ist in matrix.cpp, dann solltest du g++ so aufrufen


Code:
$ g++ c:\temp\labyrinth\define_labyrinth.cpp c:\temp\labyrinth\matrix.cpp ...



Du kannst eine einzelne Datei kompilieren, aber nicht beim Linken.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.05.2004, 21:28 Uhr
DerSchwarzeSchlumpf



asoooooooooooo *gg* hab mir gedacht dass checkt der sowieso durch das matrix.h file *g*

ok dann werd ich mal ein Makefile schreiben damitsollte das Problem eh gelöst sein (:

thx jedenfalls
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.05.2004, 23:05 Uhr
ao

(Operator)



Zitat:
DerSchwarzeSchlumpf postete
könnte es daran liegen, dass ich gewisse .h-files sowohl im .cpp als auch im dazugehörigen .h eingebunden habe? zB matrix.h sowohl im define_labyrinth.cpp und define_labyrinth.h (weil ich bei der übergabe der parameter die klasse brauche).

Also, wenn ich das richtig überblicke, übergibst du nur Pointer auf Klassen, und das bedeutet, dass du die Klassendefinitionen nicht im Header inkludieren musst, sondern es reicht hier, Forward-Deklarationen zu schreiben:

C++:
class Matrix;
class StartPoint;
class FinishPoint;
// und das ganze andere Zeugs

// jetzt die Klasse definieren:
class DefineLabyrinth
{
    // bla bla
};



Die echten Deklarationen von Matrix, StartPoint usw. brauchst du erst dann, wenn du Instanzen erzeugst, von den Klassen ableitest, auf Member zugreifst oder Ähnliches machst, wo der Compiler also den Aufbau der Klasse kennen muss. Zum bloßen Hin-und Herreichen über Pointer oder auch Referenzen ist das nicht notwendig.


Bearbeitung von ao:
Halt, stopp, bei Referenzen muss man auch wieder aufpassen. Normale (d.h. nicht-const) Referenzen müssten gehen, const-Referenzen unter Umständen nicht, wenn die benutzt werden, um ein temporäres Objekt zu konstruieren.


Du solltest das Kreuz- und Quer-Inkludieren möglichst vermeiden, weil du dabei leicht kreisförmige Abhängigkeiten baust, die der Compiler nicht auflösen kann. Regel: Man sollte möglichst viel erst im C-File inkludieren und möglichst wenig schon im Header.

ao

Dieser Post wurde am 04.05.2004 um 23:12 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
04.05.2004, 23:11 Uhr
DerSchwarzeSchlumpf




Zitat:
ao postete
[quote]DerSchwarzeSchlumpf postete
könnte es daran liegen, dass ich gewisse .h-files sowohl im .cpp als auch im dazugehörigen .h eingebunden habe? zB matrix.h sowohl im define_labyrinth.cpp und define_labyrinth.h (weil ich bei der übergabe der parameter die klasse brauche).

Also, wenn ich das richtig überblicke, übergibst du nur Pointer auf Klassen, und das bedeutet, dass du die Klassendefinitionen nicht im Header inkludieren musst, sondern es reicht hier, Forward-Deklarationen zu schreiben:

C++:
class Matrix;
class StartPoint;
class FinishPoint;
// und das ganze andere Zeugs

// jetzt die Klasse definieren:
class DefineLabyrinth
{
    // bla bla
};



Die echten Deklarationen von Matrix, StartPoint usw. brauchst du erst dann, wenn du Instanzen erzeugst, von den Klassen ableitest, auf Member zugreifst oder Ähnliches machst, wo der Compiler also den Aufbau der Klasse kennen muss. Zum bloßen Hin-und Herreichen über Pointer oder auch Referenzen ist das nicht notwendig.

Du solltest das Kreuz- und Quer-Inkludieren möglichst vermeiden, weil du dabei leicht kreisförmige Abhängigkeiten baust, die der Compiler nicht auflösen kann. Regel: Man sollte möglichst viel erst im C-File inkludieren und möglichst wenig schon im Header.

ao[/quote]

also auf das muss man auch erst einmal kommen *gg* hab zwar das wort "forward-deklaration" mal gehört, aber nicht wirklich gewusst was man damit machen kann *gg*

danke werd das jetzt gleich mal ausprobieren
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


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: