JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Klassen in Bibliotheken auslagern

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
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

BeitragVerfasst am: 04.11.2005, 01:10    Titel: Klassen in Bibliotheken auslagern Antworten mit Zitat

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. thinking Shocked Rolling Eyes


Hat scheinbar evtl. damit zu tun, dass sich Methoden gegeneinander aufrufen?! Aber warum gehts bei manchen dennoch. Neutral
_________________
Niemand ist hoffnungsloser versklavt als der, der fälschlich glaubt frei zu sein. [J. W. Goethe]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 04.11.2005, 01:22    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
PeaceKiller
JLI Master


Alter: 36
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 04.11.2005, 02:10    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 04.11.2005, 11:02    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
magynhard
Super JLI'ler



Anmeldedatum: 26.04.2003
Beiträge: 461
Wohnort: Wild durch die Welt ;-)
Medaillen: Keine

BeitragVerfasst am: 04.11.2005, 14:40    Titel: Antworten mit Zitat

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. Wink

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. Confused Shocked

Ich kann einfach keinen Fehler finden. Mad
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 04.11.2005, 14:42    Titel: Antworten mit Zitat

Junge Junge machst Du Dir Umwege, soviel Code!

Ich guck heut abend mal nach ob ich was finde Smile und optimier ggf. noch was Wink
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 05.11.2005, 01:56    Titel: Antworten mit Zitat

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 Neutral
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
LordHoto
JLI'ler


Alter: 35
Anmeldedatum: 27.03.2003
Beiträge: 137
Wohnort: Gelnhausen
Medaillen: Keine

BeitragVerfasst am: 05.11.2005, 10:38    Titel: Antworten mit Zitat

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 Neutral


das ist das selbe wie:
CPP:
#pragma once

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
magynhard
Super JLI'ler



Anmeldedatum: 26.04.2003
Beiträge: 461
Wohnort: Wild durch die Welt ;-)
Medaillen: Keine

BeitragVerfasst am: 05.11.2005, 11:10    Titel: Antworten mit Zitat

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. Shocked

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
LordHoto
JLI'ler


Alter: 35
Anmeldedatum: 27.03.2003
Beiträge: 137
Wohnort: Gelnhausen
Medaillen: Keine

BeitragVerfasst am: 05.11.2005, 11:16    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
magynhard
Super JLI'ler



Anmeldedatum: 26.04.2003
Beiträge: 461
Wohnort: Wild durch die Welt ;-)
Medaillen: Keine

BeitragVerfasst am: 05.11.2005, 12:43    Titel: Antworten mit Zitat

Handbuch "under construction". Wink

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...

Rolling Eyes
_________________
Niemand ist hoffnungsloser versklavt als der, der fälschlich glaubt frei zu sein. [J. W. Goethe]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
LordHoto
JLI'ler


Alter: 35
Anmeldedatum: 27.03.2003
Beiträge: 137
Wohnort: Gelnhausen
Medaillen: Keine

BeitragVerfasst am: 05.11.2005, 14:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
magynhard
Super JLI'ler



Anmeldedatum: 26.04.2003
Beiträge: 461
Wohnort: Wild durch die Welt ;-)
Medaillen: Keine

BeitragVerfasst am: 05.11.2005, 16:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
LordHoto
JLI'ler


Alter: 35
Anmeldedatum: 27.03.2003
Beiträge: 137
Wohnort: Gelnhausen
Medaillen: Keine

BeitragVerfasst am: 05.11.2005, 16:45    Titel: Antworten mit Zitat

gegen die standard bibliothek (libc und libstdc++) wird automatisch gelinkt, es gibt aber parameter die dies unterdruecken.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum