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

1

07.03.2005, 21:50

Linker Fehler mit TB

Jetzt habe ich mich schon dazu durchgerungen VC++ zu nutzen(Toolkit)
und da will die TB-Engine trotzdem nicht so wi ich das will! :crying:

Ich benutze diesen BSP-Code:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// Kapitel 2
// Beispielprogramm 01
// ===================
// Erstellen des Fensters und Aufrufen der Nachrichtenschleife.
// Die dafür nötigen Funktionen sind in der Datei InitWindow.cpp
// gespeichert.

#include <Windows.h>
#include <TriBase.h>
#include "InitWindow.h"
#include "Resource.h"

// ******************************************************************
// Render-Funktion
tbResult Render(float fNumSecsPassed)
{
    return TB_OK;
}

// ******************************************************************
// Move-Funktion
tbResult Move(float fNumSecsPassed)
{
    return TB_OK;
}

// ******************************************************************
// Windows-Hauptfunktion
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   char* pcCmdLine,
                   int iShowCmd)
{
    // TriBase-Engine initialisieren
    tbInit();

    // Fenster initialisieren
    InitWindow(640, 480, "Beispielprogramm Nr. 2: Fenster",
               LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1)));

    // Nachrichtenschleife
    tbDoMessageLoop(Render, Move);
    
    // Fenster herunterfahren
    ExitWindow();

    // Engine herunterfahren
    tbExit();

    return 0;
}

// ******************************************************************


Der wird wohl soweit richtig sein, nu gibt's aber immer das hier vom Compiler ausgespuckt!:

Zitat

Project : Console application
Compiler : Microsoft Visual C++ Toolkit 2003 (called directly)
Directory : C:\cpp\tb1\
--------------------------------------------------------------------------------
Switching to target: default
main.cpp
Linking executable: C:\cpp\tb1\tribase_templeate.exe
main.obj : error LNK2019: unresolved external symbol "enum tbResult __cdecl ExitWindow(void)" (?ExitWindow@@YA?AW4tbResult@@XZ) referenced in function _WinMain@16
main.obj : error LNK2019: unresolved external symbol "enum tbResult __cdecl InitWindow(int,int,char *,struct HICON__ *)" (?InitWindow@@YA?AW4tbResult@@HHPADPAUHICON__@@@Z) referenced in function _WinMain@16
C:\\cpp\\tb1\\tribase_templeate.exe : fatal error LNK1120: 2 unresolved externals
Process terminated with status 1 (0 minutes, 1 seconds)
3 errors, 0 warnings


Zur Info:
Tribase Dll's sind im Windows\system32 Verzeichniss und beide Libs von TB
werden gelinkt!
Auch um DX habe ich mich gekümmert: d3d9.lib
Alle Includes sind in den Settings, TB und DX.

Was mache ich verkehrt? ???
MfG RoaN;
Sieh da, die Menschen sind die Werkzeuge ihrer Werkzeuge geworden.

2

08.03.2005, 12:38

In der IDE müssteste da noch InitWindow.cpp oder ähnlich dem Projekt hinzufügen. In der Kommandoebene musst du die Datei glaub bloß zusätzlich im Kommando auflisten.

3

08.03.2005, 14:25

jo, include InitWindow.h und füge InitWindow.cpp dem projekt hinzu (im ordner Allgemein)


/e seh grad InitWindow.h is dabei, also nur noch die InitWindow.cpp dem Projekt hinzufügen...

Anonymous

unregistriert

4

08.03.2005, 16:57

Ich habe zwar keine Ahnung wie ich ohne die VC++IDE eine .cpp datei im Ordner _??Allgemeine??_ hinzufügen soll,
aber ich habe in der InitWindow.cpp das hier gefunden!

C-/C++-Quelltext

1
#include "InitWindow.h"


Also mal eben in meiner main.cpp aus dem .h ein .cpp gemacht und schon lief es! ;) 8)

Vielen Dank für den Hinweis auf die InitWindow.cpp!

MfG RoaN;

5

08.03.2005, 18:27

Freut mich, dass wir dir helfen können. Zum Thema, wie man eine Datei ohne IDE hinzufügt:

Du machst ja einen Konsolenaufruf. Da gibste dann auch irgendwo main.cpp(oder wie es halt sonst heißt) an. Dahinter kannste noch mehr Dateien reinschreiben, die dann halt auch kompiliert und alles dann in die *.exe-Datei einfliest.

6

17.03.2005, 20:39

Klappt soweit alles, nur wenn ich auch die Direct3DEnum.h/.cpp hinzufüge, sagt er mir ich hätte eine redifinition von so ner Struct!!!!

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <windows.h>
#include <tribase.h>

#include "InitWindow.cpp"
#include "Direct3DEnum.cpp"
#include "InitDirect3D.cpp"

int WINAPI WinMain(HINSTANCE hThisInstance,
                   HINSTANCE hPrevInstance,
                   char* pcCmdLpne,
                   int iShowCmd)
{
    tbInit();
    SDirect3DParameters Direct3DParameters;
    tbResult result = GetDirect3DParameters(&Direct3DParameters);
    tbExit();
    return 0;
}


Fehler:

Zitat

Project : Console application
Compiler : Microsoft Visual C++ Toolkit 2003 (called directly)
Directory : C:\cpp\tb2\
--------------------------------------------------------------------------------
Calculating dependencies: main.cpp
Switching to target: default
main.cpp
c:\cpp\tb2\Direct3DEnum.h(18) : error C2011: 'SDirect3DParameters' : 'struct' type redefinition
c:\cpp\tb2\Direct3DEnum.h(18) : see declaration of 'SDirect3DParameters'
Process terminated with status 1 (0 minutes, 1 seconds)




Buuuuhuhuhuhuhuhu :crying:

Was ist denn nun schon wieder verkehrt???

MfG RoaN;

7

18.03.2005, 13:58

1. Probiers mal so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <windows.h> 
#include <tribase.h> 

#include "InitWindow.cpp" 
#include "InitDirect3D.cpp" 

int WINAPI WinMain(HINSTANCE hThisInstance, 
                   HINSTANCE hPrevInstance, 
                   char* pcCmdLpne, 
                   int iShowCmd) 
{ 
    tbInit(); 
    SDirect3DParameters Direct3DParameters; 
    tbResult result = GetDirect3DParameters(&Direct3DParameters); 
    tbExit(); 
    return 0; 
} 


Zur Erklärung: In InitDirect3D.cpp wird Direct3DEnum.h schon includiert, was du in der rausgelöschten Zeile nochmal machst, und da es keine Codeguards gibt, wird die Struktur doppelt definiert.

2. Wenn das Compilieren klappt, wird es wohl einen Linkerfehler geben. Da in den Ausgaben "Console Application" steht, wird es wohl auch eine solche sein. Du musst bei einer Hauptfunktion namens "WinMain" immer eine Windows-Anwendung erstellen.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

18.03.2005, 17:32

Man bindet mit #include keine CPP-Dateien ein!
Die fügt man wie oben beschrieben zum Projekt hinzu.

9

18.03.2005, 18:36

Zitat von »"David Scherfgen"«

Man bindet mit #include keine CPP-Dateien ein!
Die fügt man wie oben beschrieben zum Projekt hinzu.


Das funktioniert aber mit dem Toolkit nicht so richtig!

MfG RoaN;
Sieh da, die Menschen sind die Werkzeuge ihrer Werkzeuge geworden.

10

18.03.2005, 18:43

Wenn ich die Source-Files einfach hinter die main.cpp setze, kommt das hier:

Quellcode

1
2
3
4
5
Calculating dependencies: main.cpp
Switching to target: default
cl : Command line warning D4026 : options apply to entire command line
cl : Command line error D2036 : '/Fo.objs\\main.obj' not allowed with multiple source files
Process terminated with status 1 (0 minutes, 4 seconds)


Als Fehler.

MfG RoaN;
Sieh da, die Menschen sind die Werkzeuge ihrer Werkzeuge geworden.

Werbeanzeige