Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
magynhard Super JLI'ler

Anmeldedatum: 26.04.2003 Beiträge: 461 Wohnort: Wild durch die Welt ;-) Medaillen: Keine
|
Verfasst am: 04.11.2005, 01:10 Titel: Klassen in Bibliotheken auslagern |
|
|
Hoho, habe bisher meine ganzen Klassen + Methoden in einer *.h-Datei gehabt.
Jetzt habe ich das Zeug in bibliothek.h und bibliothek.cpp aufgeteilt, wie es offiziell gemacht werden sollte.
Nun mein Problem:
Der (GCC-) Linker meckert
Code: |
.objs\main.o:main.cpp:(.text+0x70b4): undefined reference to `KMP_OGL_Landschaft::AddPosY(int)'
.objs\main.o:main.cpp:(.text+0x70d2): undefined reference to `KMP_OGL_Landschaft::AddPosY(int)'
.objs\main.o:main.cpp:(.text+0x70f0): undefined reference to `KMP_OGL_Landschaft::AddPosX(int)'
.objs\main.o:main.cpp:(.text+0x710e): undefined reference to `KMP_OGL_Landschaft::AddPosX(int)'
.... (und weitere)
|
Das Kuriose:
-Wenn ich den Inhalt der bibliothek.cpp unter die Klassendefinition in die bibliothek.h einfüge, somit die bibliothek.cpp also leer lasse und alles in der bibliothek.h habe, funktioniert es wieder problemlos.
-Gilt nicht für alle Methoden.
Wo ich aber doch im gewünschten Format die bibliothek.h bei der bibliothek.cpp oben "inkludiere" ...
Übliche #define-Anweisungen sind auch drinnen, um die bibliothek.h nicht mehrmals zu "inkludieren".
Hatte jemand schon das selbe Problem? Ich bin am Verzweifeln.
Hat scheinbar evtl. damit zu tun, dass sich Methoden gegeneinander aufrufen?! Aber warum gehts bei manchen dennoch.  _________________ Niemand ist hoffnungsloser versklavt als der, der fälschlich glaubt frei zu sein. [J. W. Goethe]
 |
|
Nach oben |
|
 |
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 04.11.2005, 01:22 Titel: |
|
|
Wie hast du es denn aufgeteilt? Zeig mal n bischen Code.
(Hast du die Methoden komplett aus der Klasse entfernt oder hast du die Prototypen drin gelassen?) _________________ Kochen ist ein NP-schweres Optimierungsproblem. |
|
Nach oben |
|
 |
PeaceKiller JLI Master

Alter: 36 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 04.11.2005, 02:10 Titel: |
|
|
Linkst du gegen deine neue Bibliothek? _________________ »If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine |
|
Nach oben |
|
 |
AFE-GmdG JLI MVP


Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 04.11.2005, 11:02 Titel: |
|
|
Ich glaube mit "Bibliothek" meint er noch keine DLL...
Du musst die Prototypen im Header lassen und die Implementierungen in der Cpp-Datei:
CPP: | //HeaderFile
#pragma once
#include <Windows.h> // Oder welche Header die Cpp-Datei auch immer benötigen sollte
class Foo
{
private:
// Private Objekte, z.B.
int i;
protected:
// Protected Objekte, z.B.
unsigned long ul;
public:
// Public Objekte, z.B.
Foo();
virtual ~Foo();
int GetI();
void SetUL(unsigned long);
};
|
In der Cpp-Datei werden die Funktionen dann definiert:
CPP: | #include "Foo.h"
// Und auch NUR diese Datei!
// ctor (mit Initialisierungsliste)
Foo::Foo() : i(42), ul(17)
{
}
// dtor
Foo::~Foo()
{
}
// Funktion GetI
int Foo::GetI()
{
return i;
}
// Funktion SetUL()
void Foo::SetUL(unsigned long UL)
{
ul=UL;
}
|
Das sollte alles sein. _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
 |
magynhard Super JLI'ler

Anmeldedatum: 26.04.2003 Beiträge: 461 Wohnort: Wild durch die Welt ;-) Medaillen: Keine
|
Verfasst am: 04.11.2005, 14:40 Titel: |
|
|
Das Problem tritt auf, sobald ich wie oben erwähnt, die Methoden in die .cpp auslagere. Die Prototypen sind in der .h definiert.
Damit es 100%ig nachfolgzogen werden kan, habe ich mich entschlossen den ganzen Quelltext beider Dateien hier reinzustellen. Bitte bei der Problemlösung bleiben und nicht den Schreibstil, etc. anprangern. Ist Alpha-Quelltext.
Code: |
[NACHTRAG: Quelltext aufgrund der Größe (und Geheimhaltung? ^^) nach Problemlösung wieder entfernt, vom Prinzip der gleiche wie von AFE-GmdG angegebene]
|
Warum funktionierts bei den andern beiden Klassen und manch andern Methoden?
Wenn ich nun die .cpp einfach unten in die .h einfüge, gehts ohne Probleme.
Ich kann einfach keinen Fehler finden.  _________________ Niemand ist hoffnungsloser versklavt als der, der fälschlich glaubt frei zu sein. [J. W. Goethe]

Zuletzt bearbeitet von magynhard am 05.11.2005, 17:20, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 05.11.2005, 01:56 Titel: |
|
|
Hmm...is nur eine Vermutung, aber vielleicht liegts daran:
CPP: | #ifndef KMP_OGL_LANDSCHAFT
#define KMP_OGL_LANDSCHAFT
#endif |
Vielleicht gibts da ja irgendwie Probleme, sodass er den Header erst in die CPP einbindet und es danach Probs gibt, wenn du den Header wo anders einbinden willst  _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
LordHoto JLI'ler

Alter: 35 Anmeldedatum: 27.03.2003 Beiträge: 137 Wohnort: Gelnhausen Medaillen: Keine
|
Verfasst am: 05.11.2005, 10:38 Titel: |
|
|
The Lord of Programming hat Folgendes geschrieben: | Hmm...is nur eine Vermutung, aber vielleicht liegts daran:
CPP: | #ifndef KMP_OGL_LANDSCHAFT
#define KMP_OGL_LANDSCHAFT
#endif |
Vielleicht gibts da ja irgendwie Probleme, sodass er den Header erst in die CPP einbindet und es danach Probs gibt, wenn du den Header wo anders einbinden willst  |
das ist das selbe wie:
bei MSVC.... auch bekannt als "Include Guard" damit man eine datei nicht mehrmals in eine datei zum compilieren includieren kann... (da dies sonst zu mehrfach definitionen kommen koennte)
ich glaube eher du compilierst die .cpp datei nicht?
Kann man mal deine compile gcc calls und deinen linker call sehen? |
|
Nach oben |
|
 |
magynhard Super JLI'ler

Anmeldedatum: 26.04.2003 Beiträge: 461 Wohnort: Wild durch die Welt ;-) Medaillen: Keine
|
Verfasst am: 05.11.2005, 11:10 Titel: |
|
|
Patrick
Danke für das Angebot, schade dass Du es gestern Abend wohl nicht mehr geschafft hast.
Optimierungen sind bisher noch nicht notwendig, das Kompilieren soll erst mal funktionieren.
TLOD
Danke für den Hinweis, gehört aber so, siehe LordHotos Bemerkung.
Hab's dennoch testweise mal kurz auskommentiert, ändert nichts an der Fehlermeldungsliste.
LordHoto
So scheint's!
Ich verwende Code::Blocks, weiß leider nicht, wo ich dies dort nachgucken kann.
Was diesen Verdacht bestätigt:
Ich habe eben vor das #end if der .h-Datei einfach die .cpp mit #include angegeben und siehe da, es funktioniert wieder.
Dann womöglich ein Fehler von Code::Blocks? _________________ Niemand ist hoffnungsloser versklavt als der, der fälschlich glaubt frei zu sein. [J. W. Goethe]
 |
|
Nach oben |
|
 |
LordHoto JLI'ler

Alter: 35 Anmeldedatum: 27.03.2003 Beiträge: 137 Wohnort: Gelnhausen Medaillen: Keine
|
Verfasst am: 05.11.2005, 11:16 Titel: |
|
|
Zitat: |
Ich habe eben vor das #end if der .h-Datei einfach die .cpp mit #include angegeben und siehe da, es funktioniert wieder.
|
dann ist sicher, dass du die datei nicht compilierst und nicht linkst (vllt. compilierst du sie ja auch aber linkst das objectfile dann nicht).
am besten du versuchst rauszufinden wie du deine IDE dazubringst gcc zu sagen, dass er die datei compilieren und linken soll. am besten "handbuch" lesen |
|
Nach oben |
|
 |
magynhard Super JLI'ler

Anmeldedatum: 26.04.2003 Beiträge: 461 Wohnort: Wild durch die Welt ;-) Medaillen: Keine
|
Verfasst am: 05.11.2005, 12:43 Titel: |
|
|
Handbuch "under construction".
Hmm, ist es vielleicht bisher nur ein Verständnisproblem gewesen?
Die main.cpp, welche die KMP_OGL_landschaft verwendet enthält das Programm und inkludiert die .h-Datei.
Weder diese .h-Datei, noch die .cpp-Datei sind dem Projekt als Datei hinzugefügt.
Ich habe da jetzt diese Vermutung, dass ich bisher völlig falsch davon ausgegangen bin, dass die .cpp automatisch mitkompiliert wird usw. wenn ich die zugehörige .h inkludiere?
D.h. diese Aufgabe übernimmt die IDE, sofern diese dem Projekt selbst hinzugefügt worden sind?
Hatte mich daher immer gewundert, warum die .h-Datei in der .cpp inkludiert wird, aber nicht andersherum und woher er es dann wissen sollte...
 _________________ Niemand ist hoffnungsloser versklavt als der, der fälschlich glaubt frei zu sein. [J. W. Goethe]
 |
|
Nach oben |
|
 |
LordHoto JLI'ler

Alter: 35 Anmeldedatum: 27.03.2003 Beiträge: 137 Wohnort: Gelnhausen Medaillen: Keine
|
Verfasst am: 05.11.2005, 14:35 Titel: |
|
|
klar musst du sie zu dem projekt hinzufuegen ausser du baust dir einen statische lib oder eine dynamische lib gegen die du dann einfach linkst... |
|
Nach oben |
|
 |
magynhard Super JLI'ler

Anmeldedatum: 26.04.2003 Beiträge: 461 Wohnort: Wild durch die Welt ;-) Medaillen: Keine
|
Verfasst am: 05.11.2005, 16:34 Titel: |
|
|
Dann ist das Problem wohl geklärt.
Aber bei der Standard-Bibliothek ist das doch auch nicht der Fall? Ausnahme? Oder... ? _________________ Niemand ist hoffnungsloser versklavt als der, der fälschlich glaubt frei zu sein. [J. W. Goethe]
 |
|
Nach oben |
|
 |
LordHoto JLI'ler

Alter: 35 Anmeldedatum: 27.03.2003 Beiträge: 137 Wohnort: Gelnhausen Medaillen: Keine
|
Verfasst am: 05.11.2005, 16:45 Titel: |
|
|
gegen die standard bibliothek (libc und libstdc++) wird automatisch gelinkt, es gibt aber parameter die dies unterdruecken. |
|
Nach oben |
|
 |
|