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

26.10.2008, 20:25

Problem mit Unaufgelösten Externen Symbolen

Hi,
hab mir eine eigene Header bzw. CPP Datei für eine Liste angelegt, die Objekte in die Liste aufnehmen und verwalten soll

Header:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
#include <list>
#include "QEngine_Sprite.h"
#include "Global_Variables.h"
#include <windows.h>

using namespace std;

list<CQEngine_Sprite*> Infinite_List;
list<CQEngine_Sprite*>::iterator i_list;

void AddSpriteToList(CQEngine_Sprite* Sprite);
void MoveList(int dir, int Framerate);



Cpp:

C-/C++-Quelltext

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

using namespace std;


void AddSpriteToList(CQEngine_Sprite* Sprite)
{
    Infinite_List.push_back(Sprite);
}

void MoveList(int dir, int Framerate)
{
    for (i_list = Infinite_List.begin(); i_list!=Infinite_List.end(); i_list++)
    {
        (*i_list)->MoveEx(dir, Framerate);
    }
}






Wie man sieht, verwaltet diese Liste alle möglichen Sprites

Ich bekomme aber folgende Unresolved External Symbols:

error LNK2005: "class std::list<class CQEngine_Sprite *,class std::allocator<class CQEngine_Sprite *> >::iterator i_list" (?i_list@@3Viterator@?$list@PAVCQEngine_Sprite@@V?$allocator@PAVCQEngine_Sprite@@@std@@@std@@A) already defined in Infinite_List.obj

error LNK2005: "class std::list<class CQEngine_Sprite *,class std::allocator<class CQEngine_Sprite *> > Infinite_List" (?Infinite_List@@3V?$list@PAVCQEngine_Sprite@@V?$allocator@PAVCQEngine_Sprite@@@std@@@std@@A) already defined in Infinite_List.obj

error LNK2019: unresolved external symbol "public: void __thiscall CQEngine_Sprite::MoveEx(int,int)" (?MoveEx@CQEngine_Sprite@@QAEXHH@Z) referenced in function "void __cdecl MoveList(int,int)" (?MoveList@@YAXHH@Z)

Kann mir jemand helfen?
Danke im Voraus
Dieser Post wurde aus artgerecht gehaltenen, 100% chlorfrei gebleichten, handelsüblichen Elektronen aus Freihaltung erzeugt.

Anonymous

unregistriert

2

26.10.2008, 20:29

Im Header darf man keine Variablen definieren, nur Konstanten oder Verweise auf externe Variablen.

Edit: Achja... niemals using namespace in Headern benutzen.

3

26.10.2008, 20:31

danke, jetzt ist nur noch 1 ues vorhanden:

Infinite_List.obj : error LNK2019: unresolved external symbol "public: void __thiscall CQEngine_Sprite::MoveEx(int,int)" (?MoveEx@CQEngine_Sprite@@QAEXHH@Z) referenced in function "void __cdecl MoveList(int,int)" (?MoveList@@YAXHH@Z)
Dieser Post wurde aus artgerecht gehaltenen, 100% chlorfrei gebleichten, handelsüblichen Elektronen aus Freihaltung erzeugt.

Anonymous

unregistriert

4

26.10.2008, 20:32

Schreib in deinen Header noch eine Include Guard.

5

26.10.2008, 20:33

definiere die variablen in der cpp und setz im header jeweils n "extern" davor.
das liegt daran, das so, wie dus jetz hast, der haeder, und damit die definition der Variablen, in jeder .obj Datei landet, und wenn der Linker die verbinden soll, wundert er sich natürlich, wenn er dann drei lists gleichen namen hat. Den verweis auf die variablen mit extern brauchst du allerdings, weil sich sonst der compiler beschwert, das er die variablen nicht findet.

6

26.10.2008, 20:44

Also wie jetzt, soll ich in die Header die Lists reinschreiben (mit extern) und in die cpp auch?
Dieser Post wurde aus artgerecht gehaltenen, 100% chlorfrei gebleichten, handelsüblichen Elektronen aus Freihaltung erzeugt.

7

26.10.2008, 20:46

Zitat von »"Arrows"«

Also wie jetzt, soll ich in die Header die Lists reinschreiben (mit extern) und in die cpp auch?

ja, weil extern+plus definition sagt dem compiler, das die Variable in einer anderen .obj definiert wird (in deem Fall die .obj deiner .cpp), der compiler setzt dann entsprechende externe Verweise, die dann vom Linker aufgelöst werden

8

26.10.2008, 20:47

Zitat von »"Arrows"«

Also wie jetzt, soll ich in die Header die Lists reinschreiben (mit extern) und in die cpp auch?
in die cpp allerdings ohne extern davor

9

26.10.2008, 20:55

Also jetzt hab ich nicht das erreicht was ich wollte aber was besseres ;)

Und zwar wollte ich ja bis vor 3 Stunden die List direkt ansprechen, das lief nicht

Dann schrieb ich mir die Funktionen, um sie per Funktionen zu benutzen
-> die liefen auch nicht -> im forum (hier) nachgefragt

und ihr sagt mir jetzt (unfreiwillig), wie es ohne funktionen geht :D

Tja, danke alles läuft :D

EDIT: Und das ues wegen der MoveEx Funktion bekam ich weil die gar nicht existierte :roll: die hab ich vor ner woche von der CSprite in die CShip verschoben weil sie nur dort gebraucht wird :roll:
Dieser Post wurde aus artgerecht gehaltenen, 100% chlorfrei gebleichten, handelsüblichen Elektronen aus Freihaltung erzeugt.

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

10

26.10.2008, 21:25

Zitat


EDIT: Und das ues wegen der MoveEx Funktion bekam ich weil die gar nicht existierte Rolling Eyes die hab ich vor ner woche von der CSprite in die CShip verschoben weil sie nur dort gebraucht wird Rolling Eyes

Würde sie nicht existieren, würdest du aber einen Compiler-Fehler erhalten. Dein Fehler war aber ein Linkerfehler. Das heißt die Funktion existiert schon noch, nur wurde sie nicht definiert. Wenn du sie nicht brauchst solltest du sie aus der Sprite-Klasse diese Funktion entweder entfernen, oder sie als nichtstuende virtuelle Funktion definieren.

Werbeanzeige