Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Anonymous

unregistriert

1

18.12.2003, 17:12

eigene Engine

Hi, Leute!
Ich will meine Klassen zum Initialisieren von diversen DirectX-Komponenten in einer mini-Engine zusammenfassen.
Das klappt auch soweit wunderbar. Ich hab ein Verzeichnis für die Header- und eins für die Quellcodedateien. Diese habe ich beide bei MSVC++ zu den Verzeichnissen hinzugefügt.
Beim Ausführen von Programmen, die diese Engine benutzen, sagt mir der Linker aber immer:

error LNK2001: Nichtaufgeloestes externes Symbol "public: __thiscall DDClass::~DDClass(void)" (??1DDClass@@QAE@XZ)

und das für jede Methode, die in den .cpp-Dateien stehen.
Sonst kenn ich das nur, wenn ich irgendwelche Bibliotheken nicht eingefügt hab, aber was soll ich hier machen?

Sollte es sich um eine dumme Frage handeln, bitte ich um Verständnis (ich bekomme Davids Buch erst zu Weihnachten) *g*

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

2

18.12.2003, 18:07

Du hast vergessen eine mit extern deklarierte Klasse / Methode / Variable zu definieren.

BSP:

extern int variable; // Vordeklaration, keine "echte" deklaration.

int variable; // deklaration

genauso müsste das sich mit Methoden verhalten :)

Maxi

Treue Seele

Beiträge: 136

Wohnort: Müncheberg

Beruf: Ich muss noch in die Schule

  • Private Nachricht senden

3

18.12.2003, 18:11

Gluab ich nicht...

Du musst entweder:
a) ne Dll erstellen und die Lib davon dann einbinden
b) die Quellcodedateinen zum Projekt hinzufügen
oder
c) ne LIB von der Engine erstellen, weiß´aber nciht, ob das geht und die dann mitlinken
Gruß, Maxi

Hier, die Homepage von meiner Band:
www.maxis-house.de

Könnt euch unsere ersten Songs saugen...

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

4

18.12.2003, 18:20

@Maxi
wieso so umständlich mit Lib und DLL? hat er doch gar nix davon gesagt :)

Also entweder haste bei vererbung vergessen einen Constructor anzulegen, extern benutzt (böse) oder schlimme makros gemacht :)

5

18.12.2003, 18:24

Das müsste eigentlich wie schon gesagt mit einem "extern" vor den einzelnen Klassen/Funktionen/Variablen funktionieren.
(Was ist an extern denn so schlimm) ???

Sollte deine Engien aus einer Dll und einer Lib Datei bestehen musst du die Lib Datei mit in dein Programm einbinden, ebenso musst du die Header Dateien deiner Engine einbinden.
Um die Funktionen/ Klassen im Programm nutzen zu können musst du noch "__declspec(dllexport)" davor setzen, z.B:

Quellcode

1
2
3
4
5
class __declspec(dllexport) ExportKlasse
{
   public:
    void Say(void) { MessageBox(NULL,"Hallo",NULL,NULL);}
};


In deinem Programm muss nun eine Header-Datei eingebunden werden, die diese Klasse mit __declspec(dllimport) wieder importiert.
In a world without fences and walls - who needs windows and gates ?

http://www.Paid4Mailer.de/?refid=8422

6

18.12.2003, 19:32

Man brauch kein extern. Zumal hat er nichts von DLL oder Libs gesagt. Fuer eine Mini-Engine ist dies auch viel zu umstaendlich.

Es koennte sich um zwei Fehler handeln.
a) Dein Klassenname wurde ein bissel falsch geschrieben, oder
b) Du hast vergessen die cpp-Files in dein Projekt einzubinden

Was anderes faellt mir nicht ein.

Versteh ich das richtig das alle deine Methoden diesen Fehler produzieren? Denn wenn es sich nur um den Destruktor handelt, haste ihn schlicht vergessen zu Implementieren.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Anonymous

unregistriert

7

18.12.2003, 20:30

Danke für eure Unterstützung!
Wenn ich die cpp-Dateien einbinde, klappt es.
Ich hab aber keine Lust in jedes Programm die ganzen Dateien einzubinden.
Kann ich das weglassen, wenn ich ne Bibliothek einbinde?
Wie ist das denn bei der TriBase-Engine?

Wie erstelle ich denn eíne Bibliothek?

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

8

18.12.2003, 20:46

hier scheinen irgendwie welche richtig DLL und Lib geil zu werden wenn sie nur das wort "Engine" hören ;D;D;D

pervers... ;D

9

18.12.2003, 20:48

Das ist doch der einzige Weg, wenn man nicht jede cpp-Datei einbinden will, oder!?
Es interessiert mich halt...
Wie erstellt man denn Bibliotheken?

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

10

18.12.2003, 20:52

Also eine Bibliothek ist eine .lib datei. (kommt von Library). Wenn du eine DLL benutzen willst für deine Engine (kann ichz dir auch nur empfehlen), erstellst du mit Visual C++ 6 oder was auch immer eine "Win32 Dynamic Link Libraray (DLL)" (bei anderen Versionen müsste es so ähnlich klingen)

Wenn du die DLL durch die DLL-Main funktion definiert hast, z.B.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//----------------------------------------------------------------------------------------
bool APIENTRY DllMain(HMODULE hModule, DWORD dwReasonFoCall, LPVOID pvReserved)  {
    
    // Jetziges DLL Handle übergeben
    e_g_DLL_Handle = hModule;

    switch(dwReasonFoCall) {
        case DLL_PROCESS_DETACH:
        // Engine herunterfahren, wenn dies noch nicht passiert ist
            if(e_g_bInitCalled == true && e_g_bExitCalled == false)  {
                Exit();
            }
            
        break;
    }
    return true;
}


wird im Debug - Ordner normalerweise automatisch eine Lib Datei erzeugt.
Und eine DLL, die du in deinen Windows\System Ordner (Windows\System) kopierst

Wenn du dann mit einer anderen Anwendung auf deine Engine zugreifen willst, musst du unter Extras->Optionen (zumindest bei Visual C++ 6) die Pfade einstellen (Bibliothekspfad, wo deine Lib Datei zu finden ist und Include Pfade, wo deine Include Dateien zu finden sind)! (steht alles im Buch) ;)

unter Projekte->Einstellungen Registerkarte 'Linker' siehst du in einem Eingabe feld den Eintrag 'kernel32.lib, ...." und diverse andere Bibliotheken. füge nun am besten noch vor "kernel32.lib deine Bibliothek ein + Leerzeichen also:

test.lib kernel32.lib ....

dann noch in deine Anwendung, die auf die Engine zugreifen soll:
ein #inlude hinein (zu deiner Header Datei für die Engine), die alle anderen Dateien beinhaltet. Beispiel folgt:

engine.h -> Das ist unserer "Hauptheader", er fügt alles andere ein
vector2D.h -> Header für 2D Vektoren
vector3D.h -> Header für 3D Vectoren

engine.cpp -> Cpp Datei für DLL-Main
vector2D.cpp -> Cpp Datei für vec 2D
vector3D.cpp -> Cpp Datei für vec 3D

Inhalt der engine.h:

#include "vector2D.h"
#include "vector3D.h"
// ^^ alle anderen "Bestandteile unserer Engine" werden eingefügt

// -----------------------------------------------

Inhalt vector2D.h

// Definitionen........
KEIN Include zu engine.h oder vector3D!

// -----------------------------------------------

Inhalt vector3D.h

// Definitionen........
KEIN Include zu engine.h oder vector2D!

// -----------------------------------------------

Inhalt engine.cpp

#include "engine.h" // bzw. <engine.h>

// -----------------------------------------------

Inhalt vector2D.cpp

#include "engine.h" // bzw. <engine.h>
// Definitionen........

// -----------------------------------------------

Inhalt vector3D.cpp

#include "engine.h" // bzw. <engine.h>

Werbeanzeige