Was ist das für ein Fehler?



  • Hallo zusammen

    Ich habe mein Spiel weitergeschrieben, nun habe ich noch einen Gegner programmiert. Doch als ich den Gegner fertig programmiert hatte, gab es folgende zwei Fehler.

    1>------ Erstellen gestartet: Projekt: Weltraum-Spiel, Konfiguration: Debug Win32 ------
    1>Verknüpfen...
    1>Game.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp___CrtDbgReportW" in Funktion ""public: class std::list<class CGegner,class std::allocator<class CGegner> >::_Const_iterator<1> & __thiscall std::list<class CGegner,class std::allocator<class CGegner> >::_Const_iterator<1>::operator++(void)" (??E?$_Const_iterator@$00@?$list@VCGegner@@V?$allocator@VCGegner@@@std@@@std@@QAEAAV012@XZ)".
    1>C:\Dokumente und Einstellungen\Patrick\Eigene Dateien\Visual Studio 2008\Projects\Weltraum-Spiel\Debug\Weltraum-Spiel.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
    1>Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\Patrick\Eigene Dateien\Visual Studio 2008\Projects\Weltraum-Spiel\Weltraum-Spiel\Debug\BuildLog.htm" gespeichert.
    1>Weltraum-Spiel - 2 Fehler, 0 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
    

    Habe ich eine lib-Datei vergessen hinzuzufügen?

    Könnt ihr mit sagen, was ich vergessen habe?

    Gruss Eglifisch1



  • Es ist möglich, dass eine Bibliothek vergessen wurde. Linker-Fehler dieser Art treten auf, wenn ein Linkersymbol nicht definiert ist. Das kann auch sein, wenn du eine nicht definierte Funktion oder Methode in deinem Quellcode aufrufst.



  • Hallo zusammen

    Was braucht man den für eine Bibliothek für Listen?

    Den als ich den Gegner programmiert habe benötigte ich eine Liste.

    Gruss Eglifisch1



  • Für std::list brauchst du eigentlich nichts Spezielles. Der Fehler liegt in std::list<>::operator++ , vielleicht stimmt etwas in der Standardbibliothek nicht (evtl. müsstest du mal etwas neu installieren).

    Bei deinem Code bist du dir sicher, dass alle Funktionen schön definiert wurden?



  • Also ich habe das ganze etwa schon dreimal angeschaut, und ich fand bis jetzt noch keinen Fehler. Aber ich zeige mal einen teil aus meinem Code.

    Codeausschnitt:

    // Game.h
    //
    
    #ifndef _GAME_H__
    #define _GAME_H__
    
    // Include-Dateien
    //
    
    #include <list>
    #include "Player.h"
    #include "Menue.h"
    #include "Optionen.h"
    #include "Gegner.h"
    #include <iostream>
    
    using namespace std;
    
    // Klasse
    //
    class CGame
    {
    public:
    
    	// Memberfunktionen
    	//
    	// Konstruktor
    	//
    	CGame ();
    
    	void Init ();
    	void Run ();
    	void Quit ();
    
    private:
    
    	// Memberfunktionen
    	//
    	void ProcessEvents ();
    	void SpawnGegner ();
    	void RenderGegner ();
    	void bGameRun ();
    	void bMenueRun ();
    	void bOptionenRun ();
    
    	// Membervariablen
    	//
    	CPlayer		 * m_pPlayer;
    	CSprite		 * m_pBackground;
    	CSprite		 * m_pSpriteGegner;
    	CMenue		 * m_pMenue;
    	COptionen	 * m_pOptionen;
    	bool		   m_bRun;
    	bool		   m_bGameRun;
    	bool           m_bMenueRun;
    	bool           m_bOptionenRun;
    	float		   m_fGegnerTimer;
    	list <CGegner> m_GegnerList;
    };
    
    #endif
    
    // Game.cpp
    //
    
    //Include-Dateien
    //
    
    #include "Game.h"
    
    CGame::CGame()
    {
    	m_pPlayer = NULL;
    	m_pBackground = NULL;
    	m_pSpriteGegner = NULL;
    	m_pMenue = NULL;
    	m_pOptionen = NULL;
    }
    
    void CGame::Init()
    {
    	// Neuen Spieler initialisieren
    	//
    	m_pPlayer = new CPlayer;
    	m_pPlayer->Init ();
    	m_pPlayer->Reset ();
    
    	// Hintergrundbild (Sprite) laden
    	//
    	m_pBackground = new CSprite;
    	m_pBackground->Load ("Background.bmp");
    
    	// Gegner initialisieren
    	//
    	m_pSpriteGegner = new CSprite;
    	m_pSpriteGegner->Load ("Gegner.bmp");
    	m_pSpriteGegner->SetColorKey (255, 0, 255);
    
    	// Menue initialisieren
    	//
    	m_pMenue = new CMenue;
    	m_pMenue->Init ();
    	m_pMenue->Reset ();
    
    	// Optionen initialisieren
    	//
    	m_pOptionen = new COptionen;
    	m_pOptionen->Init ();
    	m_pOptionen->Reset ();
    
    	// Timer für Gegner zurücksetzen
    	//
    	m_fGegnerTimer = 0.0f;
    
    	// Run läuft
    	//
    	m_bRun = true;
    
    	// Menue läuft
    	//
    	m_bMenueRun = true;
    
    	// Option läuft
    	//
    	m_bOptionenRun = true;
    
    	// Spiel läuft 
    	//
    	m_bGameRun = true;
    
    } // Init
    
    void CGame::Quit()
    {
    	// Spieler freigeben
    	//
    	if (m_pPlayer != NULL)
    	{
    		delete (m_pPlayer);
    		m_pPlayer = NULL;
    	}
    
    	if (m_pBackground != NULL)
    	{
    		delete (m_pBackground);
    		m_pBackground = NULL;
    	}
    
    	if (m_pSpriteGegner != NULL)
    	{
    		delete (m_pSpriteGegner);
    		m_pSpriteGegner = NULL;
    	}
    
    	if (m_pMenue != NULL)
    	{
    		delete (m_pMenue);
    		m_pMenue = NULL;
    	}
    
    	if (m_pOptionen != NULL)
    	{
    		delete (m_pOptionen);
    		m_pOptionen = NULL;
    	}
    } // Quit
    
    void CGame::Run()
    {
    	// Hauptschleife des Spiels durchlaufen
    	//
    	while (m_bRun == true)
    	{
    		// bMenueRun aufrufen
    		//
    		bMenueRun ();
    
    		// bOptionenRun
    		//
    		bOptionenRun ();
    
    		// bGameRun
    		//
    		bGameRun ();
    
    	}
    } // Run
    
    void CGame::bMenueRun()
    {
    	while (m_bMenueRun == true)
    	{
    		// Events bearbeiten
    		//
    		ProcessEvents ();
    
    		// Framework updaten und Buffer löschen
    		//
    		g_pFramework->Update ();
    		g_pFramework->Clear ();
    
    		// Hintergrundbild rendern
    		//
    		m_pBackground->Render ();
    
    		// Menue updaten und rendern
    		//
    		m_pMenue->Render ();
    
    		// Buffer flippen
    		//
    		g_pFramework->Flip ();
    	}
    } // bMenueRun
    
    void CGame::bOptionenRun()
    {
    	while (m_bOptionenRun == true)
    	{
    		// Events bearbeiten
    		//
    		ProcessEvents ();
    
    		// Framework updaten und Buffer löschen
    		//
    		g_pFramework->Update ();
    		g_pFramework->Clear ();
    
    		// Hintergrundbild rendern
    		//
    		m_pBackground->Render ();
    
    		// Optionen updaten und rendern
    		//
    		m_pOptionen->Render ();
    
    		// Buffer flippen
    		//
    		g_pFramework->Flip ();
    	} 
    } // bOptionenRun
    
    void CGame::bGameRun()
    {
    	while (m_bGameRun == true)
    	{
    		// Events bearbeiten
    		//
    		ProcessEvents ();
    
    		// Framework updaten und Buffer löschen
    		//
    		g_pFramework->Update ();
    		g_pFramework->Clear ();
    
    		// Hintergrundbild rendern
    		//
    		m_pBackground->Render ();
    
    		// Spieler updaten und rendern
    		//
    		m_pPlayer->Update ();
    		m_pPlayer->Render ();
    
    		// Neue Gegner hinzufügen
    		//
    		SpawnGegner ();
    
    		// Gegner rendern
    		//
    		RenderGegner ();
    
    		// Buffer flippen
    		//
    		g_pFramework->Flip ();
    	}
    }
    
    void CGame::ProcessEvents()
    {
    	SDL_Event Event;
    
    	// Gab es ein Event?
    	//
    	if (SDL_PollEvent (&Event))
    	{
    		// Ja, also schauen welches
    		//
    		switch (Event.type)
    		{
    			// Beenden?
    			//
    		case (SDL_QUIT):
    			{
    				// Spiel beenden
    				//
    				m_bRun = false;
    				m_bGameRun = false;
    				m_bMenueRun = false;
    				m_bOptionenRun = false;
    			} break;
    
    			// Wurde eine Taste gedrückt?
    			//
    		case (SDL_KEYDOWN):
    			{
    				switch (Event.key.keysym.sym)
    				{
    				case (SDLK_b):
    					{
    						// Ja, also Spiel beenden
    						//
    						m_bRun = false;
    						m_bGameRun = false;
    						m_bMenueRun = false;
    						m_bOptionenRun = false;
    					} break;
    
    				case (SDLK_s):
    					{
    						// Wenn S für (Spielen) gedrückt wird, wird das Menue und die Optionen beendet
    						//
    						m_bMenueRun = false;
    						m_bOptionenRun = false;
    						m_bGameRun = true;
    
    						// bGameRun aufrufen
    						//
    						bGameRun ();
    
    					} break;
    
    				case (SDLK_o):
    					{
    						// Wenn o für (Optionen) gedrückt wird, wird das Menue und das Spiel beendet.
    						//
    						m_bMenueRun = false;
    						m_bGameRun = false;
    						m_bOptionenRun = true;
    
    						// bOptionenRun aufrufen
    						//
    						bOptionenRun();
    
    					} break;
    
    				case (SDLK_m):
    					{
    						// Wenn m für (Menue) gedrückte wird, wird die Optionen und das Spiel beendet.
    						//
    						m_bOptionenRun = false;
    						m_bGameRun = false;
    						m_bMenueRun = true;
    
    						// bMenueRun aufrufen
    						//
    						bMenueRun ();
    
    					} break;
    				}
    			} break;
    		}
    	}
    } // ProcessEvents
    
    void CGame::SpawnGegner()
    {
    	// Timer für nächsten Gegner erhöhen
    	//
    	m_fGegnerTimer += g_pTimer->GetElapsed ();
    
    	// Wenn eine halbe Sekunde vergangen ist,
    	// dann einen neuen Gegner erzeugen
    	if (m_fGegnerTimer >= 0.5f)
    	{
    		// Neuer Gegner
    		//
    		CGegner Gegner;
    
    		// Zufällige X-Position
    		//
    		int XPos = rand () % 736;
    
    		// Gegner initialisieren
    		Gegner.Init (m_pSpriteGegner, static_cast<float> (XPos), -60.0f);
    
    		// Gegner in Liste einfügen
    		//
    		m_GegnerList.push_back (Gegner);
    
    		// Zeitgeber wieder zurücksetzen
    		//
    		m_fGegnerTimer = 0.0f;
    	}
    } // SpawnGegner
    
    void CGame::RenderGegner ()
    {
    	// Iterator für die Gegner-Liste
    	//
    	list<CGegner>::iterator It;
    
    	// Gegner-Liste durchlaufen
    	//
    	for (It = m_GegnerList.begin (); It != m_GegnerList.end (); ++It)
    	{
    		// Gegner rendern
    		//
    		It->Render ();
    
    		// Gegner updaten
    		//
    		It->Update ();
    	}
    } // RenderGegner
    

    Gruss Eglifisch1



  • Da du MSVC2008 benutzt, stell mal unter den Projektoptionen unter C++ > Codegenerierung von Multithreaded (DLL) auf Multithreaded Debug (DLL) um. Dann sollte es klappen.



  • Eglifisch1 schrieb:

    CGame::CGame()
    {
        m_pPlayer = NULL;
        m_pBackground = NULL;
        m_pSpriteGegner = NULL;
        m_pMenue = NULL;
        m_pOptionen = NULL;
    }
    

    nein, mach das per initialisierungsliste

    CGame::CGame()
     : m_pPlayer(NULL), m_pBackground(NULL), m_pSpriteGegner(NULL), m_pMenue(NULL), m_pOptionen(NULL)
    {   }
    


  • Noch einige Dinge, die mir aufgefallen sind:

    // Bezeichner, die mit _ und Grossbuchstaben bzw. __ beginnen, sind für den Compiler reserviert
    #ifndef _GAME_H__
    #define _GAME_H__
    
    // ich würde mich an deiner Stelle für deutsch oder englisch entscheiden
    m_pSpriteGegner;
    m_bMenueRun;
    m_bOptionenRun;
    m_fGegnerTimer;
    
    // Für die Initialisierung gibts den Konstruktor, fürs Beenden den Destruktor.
    // Das würde ich nutzen (oder zumindest diese Funktionen dort aufrufen).
    void Init ();
    void Quit ();
    
    // Folgender Kommentar ist etwa gleich überflüssig wie:  i++ // inkrementiere i
    // bMenueRun aufrufen
    //
    bMenueRun ();
    
    // Beim Abfragen der Events solltest du eine While-Schleife und keine If-Abfrage haben,
    // da die Events auf einem Stack sind und du mittels PollEvent die Events nacheinander
    // durchgehst. Ansonsten könnten Ereignisse ignoriert werden.
    if (SDL_PollEvent (&Event))
    
    // Die case-Konstante muss nicht in Klammern stehen, zudem hat ein Block nach
    // dem case keine Bedeutung
    case (SDL_QUIT):
       {
          // ...
       } break;
    


  • Danke viel mal für die vielen Vorschläge zur Verbesserung meines Spiels.

    Nun habe ich die Dinge verändert, doch jetzt gibt es noch einen Fehler und eine Warnung.

    1>------ Erstellen gestartet: Projekt: Weltraum-Spiel, Konfiguration: Debug Win32 ------
    1>Kompilieren...
    1>Button.cpp
    1>Framework.cpp
    1>Game.cpp
    1>Gegner.cpp
    1>main.cpp
    1>Menue.cpp
    1>Optionen.cpp
    1>Player.cpp
    1>Sprite.cpp
    1>Timer.cpp
    1>Code wird generiert...
    1>Verknüpfen...
    1>MSVCRTD.lib(cinitexe.obj) : warning LNK4098: Standardbibliothek "msvcrt.lib" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden.
    1>Das Manifest wird eingebettet...
    1>mt.exe : general error c101008a: Failed to save the updated manifest to the file ".\Debug\Weltraum-Spiel.exe.embed.manifest". Falscher Parameter.
    1>Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\Patrick\Eigene Dateien\Visual Studio 2008\Projects\Weltraum-Spiel\Weltraum-Spiel\Debug\BuildLog.htm" gespeichert.
    1>Weltraum-Spiel - 1 Fehler, 1 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
    

    Könnt ihr mit sagen, was hier falsch ist?

    Gruss Eglifisch1



  • Das mit dem Manifest gibt es manchmal, da hilft meistens Rekompilieren oder Neu-Erstellen der Projektmappe.

    Die Warnung wegen MSVCRT ist eigentlich nicht sehr wichtig, aber du könntest bei den Projekt-Optionen unter den Linker-Einstellungen den Eintrag "msvcrt.lib" zu den ignorierten Bibliotheken hinzufügen.


Anmelden zum Antworten