Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Newbie: Verstehe Problem mit "undefined refernce" nicht

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
07.03.2006, 17:43 Uhr
FunnyDingo



Hallo zusammen,

ich habe vor einiger Zeit angefangen C++ zu lernen. Habe einige "Learning by doing" Programme geschrieben, die auch alle fehlerlos arbeiten (und ich habe auch verstanden warum ;-).

Nun habe ich ein Anwendung mit mehrern Dateien:
class1.cpp
class1.h
class2.cpp
class2.h
problem_datei.cpp
prog.cpp

In class1 und class2 werden Klassen gebaut. In dem Header-File befindet sich die Deklaration und in den cpp-Dateien die Definitionen (hoffe ich habe die Begriffe gerade nicht vertauscht).

In der class1.cpp mache ich folgendes

C++:
class1 klasse_1;

und in class2.cpp dies

C++:
class2 klasse_2;


In der problem_datei.cpp hole ich mir die Instanzen via

C++:
extern class1 klasse_1;
extern class2 klasse_2;

Außerdem habe ich via include die Header-Dateien in die problem_datei.cpp geholt.

Nun kompilere ich das ganze mit einem Makefile

Code:
LIBS = -L /usr/local/lib -lgcc -ldl
CC = g++
CCFLAGS =

%.o:    %.cpp
    $(CC) $(CCFLAGS) -c $*.cpp -o $*.o

all: prog plugins

clean:
    find . -name \*.o | xargs rm -f

prog: ./class1.o ./class2.o ./problem_datei.o ./prog.o
    $(CC) -o prog $+ $(LIBS)

./class1.o: ./class1.cpp
./class2.o: ./class2.cpp
./problem_datei.o: ./problem_datei.cpp
./prog.o: ./prog.cpp



Die Objekt-Dateien werden ohne Fehler erstellt. Wenn dann aber alle zusammen geführt werden, bekomme ich folgenden Fehler:

Code:
problem_datei.o: In function `func':
problem_datei.cpp:(.text+0x14b): undefined reference to `klasse_2'
collect2: ld returned 1 exit status


Wenn ich den Aufruf "klasse_2.func()" auskommentiere, klappt alles wunderbar. Auch der Zugriff aus class1/klasse_1 geht ohne Probleme.

Kann das was mit der Reihenfolge beim kompilieren zu tun haben? Muss ich in dem Makefile noch irgendetwas anpassen? Hinweis: Die Anweisungen im Makefile habe ich mir zusammen kopiert und solange geändert bis es lief. Ich würde nicht behaupten das ich genau verstehe was das Makefile macht.

lg,
FunnyDingo
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.03.2006, 14:30 Uhr
kronos
Quotenfisch
(Operator)


Das Makefile sieht okay aus.
Ist klasse_2 auch global definiert?
Globale Variablen sind übrigens kein schöner Stil...
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.03.2006, 14:34 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


vergessen in der poroblem_datei.cpp den header von klasse 2 zu inkludieren?
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.03.2006, 14:34 Uhr
RHBaum




Zitat:

In der problem_datei.cpp hole ich mir die Instanzen via

C++:
extern class1 klasse_1;
extern class2 klasse_2;



Warum ?

mit extern sagst du dem compiler, das du die instanz klasse_1 und klasse_2 irgendwo ausserhalb schon instanziiert hasst, und diese Verbindung erst beim linken herstellen moechtest ....
und hasst du das ? wo in deinem Code werden die Instanzen klasse_1 und klasse_2 erzeugt.
also irgendwo in einer anderen cpp (oder scho kompiliert in ner lib) in nem offiziellen teil muss sowas auftauchen !

class1 klasse_1;
class2 klasse_2;

tut es das ? wenn nicht, mosert dein linker natuerlich, da er fuer die "referenz" in deiner problem_datei.cpp die zugehoerigen richtige Instanz ned finden kann.

extern sollt man sehr mit bedacht einsetzen, glaub nicht das du es wirklich absichtlich nutzen wolltest. extern nimmt man meist, um globale Instanzen zu erzeugen, oder um zugriff auf vordefinierte Bereiche/Variablen zu bekommen die einfach in ner zentralen datei verwaltet werden sollen .... Und das sollt man schon mit Bedacht einsetzen (sauberer Stil ! globale variablen = boese).

zeig mal den code von problem_datei.cpp

Ciao ...

Dieser Post wurde am 08.03.2006 um 14:37 Uhr von RHBaum editiert.
 
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: