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::listbrauchst du eigentlich nichts Spezielles. Der Fehler liegt instd::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 (); } } // RenderGegnerGruss 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.