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

09.07.2012, 18:05

SDL_LoadBMP durch IMG_Load ersetzen

Hallo,

ich bin nun mit dem Spielekapitel fertig und versuche gerade den Code nach meinen wünschen anzupassen/zu erweitern. Dazu will ich gerne andere Bildformate nutzen.
Ich habe mir dazu die Datei "SDL_image-devel-1.2.12-VC.zip" von der Projektseite heruntergeladen.
Datei entpackt, den Ordner ins richtige Verzeichnis verschoben und in den Projekteigenschaften beim Includeverzeichnis folgendes hinzugefügt:

Quellcode

1
C:\Users\Chris\Documents\Visual Studio 2010\Projects\SDL_image-1.2.12\include


und beim Bibliothekenverzeichnis:

Quellcode

1
C:\Users\Chris\Documents\Visual Studio 2010\Projects\SDL_image-1.2.12\lib\x64



Danach noch beim Linker

Quellcode

1
SDL_image.lib


Dann habe ich in die timer.hpp folgende Datei inkludiert:

C-/C++-Quelltext

1
#include "SDL_image.h"



Zuletzt noch in der Sprite.cpp folgendes:

C-/C++-Quelltext

1
m_pImage = SDL_LoadBMP (sFilename.c_str () );


ersetzt durch

C-/C++-Quelltext

1
m_pImage = IMG_Load(sFilename.c_str() );


Beim Ausführen erhalte ich folgenden Fehler:

Quellcode

1
2
3
4
5
1>------ Erstellen gestartet: Projekt: SDL_Game, Konfiguration: Debug Win32 ------
1>MSVCRTD.lib(cinitexe.obj) : warning LNK4098: Standardbibliothek "msvcrt.lib" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden.
1>Sprite.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_IMG_Load" in Funktion ""public: void __thiscall CSprite::Load(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?Load@CSprite@@QAEXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)".
1>C:\Users\Chris\Documents\Visual Studio 2010\Projects\SDL_Game\Debug\SDL_Game.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========


Irgendwas scheint mit der Bibliothek von SDL_Image nicht zu stimmen oder ich hab was falsch eingebunden (soweit brachte mich google). Leider konnte ich keine funktionierende Lösung finden.
Vielleicht hat ja jemand 'ne Idee?

Danke!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

09.07.2012, 18:08

Den Fehler erhältst du nicht beim Ausführen sondern bereits davor beim Kompilieren (genaugenommen beim Linken). Offenbar hast du vergessen, die Library, in der sich die Funktion IMG_Load() befindet, zu linken. Willst du SDL_image statisch oder als dll linken? Ich vermute mal, die .lib, die du da hast, ist eben keine normale statische Library, sondern nur eine Import Library. Um die Library als dll zu linken, braucht es vermutlich noch irgendein #define, damit die Header die richtigen Deklarationen liefern...

Abgesehen davon: Kompilierst du dein Projekt tatsächlich für x64? Defaulteinstellung ist nämlich normales 32 Bit x86...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (09.07.2012, 18:13)


3

09.07.2012, 18:16

Abgesehen davon: Kompilierst du dein Projekt tatsächlich für x64? Defaulteinstellung ist nämlich normales 32 Bit x86...

Das war wohl der Fehler. Habs nun auf x86 umgestellt.

Nun erhalte ich eine Windowsfehlermeldung beim Kompilieren:


Zitat von »"SDL_GAME.exe - Systemfehler"«


Das Programm kann nicht gestartet werden, da SDL_image.dll auf dem Computer fehlt. Installieren Sie das Programm erneut, um das Problem zu beheben.


Die SDL_image.dll ist im x86-Verzeichnis jedoch vorhanden.

4

09.07.2012, 18:17

Du musst die DLL in dem Ordner kopieren, wo das Programm ist.

MfG
Delop

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

09.07.2012, 18:24

Mach mal ein komplettes Rebuild. Der Fehler kommt wohl, weil es beim Kompilieren Probleme gab und daher keine .exe erstellt wurde, die gestartet werden könnte, du die entsprechende Messagebox aber beim ersten Mal, ohne sie zu lesen, weggeklicked und die Checkbox, die dafür sorgt, dass die Meldung nichtmehr angezeigt wird, angewählt hast...

Unter Tools > Options > Projects and Solutions > Build and Run stellst du folgende Option wieder auf den richtigen Wert zurück:

(Link)


Für die Zukunft empfehle ich, anstatt einfach immer nur auf den grünen Pfeil zu klicken, F7 zu drücken, um dein Projekt nur zu kompilieren (Alternativ übers Menü). Ausführen dann, wenn das geklappt hat, mit dem grünen Pfeil oder per F5.

EDIT: Sry, hab deine Fehlermeldung oben nicht genau genug gelesen -.-

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »dot« (09.07.2012, 18:43)


6

09.07.2012, 18:42

Habe die .dll nun in den richtigen Ordner kopiert, damit startet das Programm zumindest. Jedoch stürzt es gleich wieder ab und springt in die if-Bedingung, weil das Bild anscheinend nicht richtig geladen wird:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    // Bild laden
    m_pImage =  IMG_Load(sFilename.c_str() );
    // Prüfen, ob alles glatt ging
    if (m_pImage == NULL)
    {
        cout << "Fehler beim Laden von: " << sFilename.c_str ();
        cout << endl;
        cout << "Fehlermeldung: " << SDL_GetError () << endl;

        // Framework herunterfahren
        g_pFramework->Quit ();

        // Gesamtes Spiel beenden
        exit (3);
    }


Ändere ich in der Game.ccp

C-/C++-Quelltext

1
m_pSpriteBackground->Load ("Data/level1.jpg");

in

C-/C++-Quelltext

1
m_pSpriteBackground->Load ("Data/level1.bmp");


funktioniert das Spiel. Da scheint noch ein Fehler mit der .jpg Datei vorzuliegen. Jemand 'ne Idee?

Edit:
Der Fehler lautet wie folgt:

Quellcode

1
2
Der Thread 'Win32-Thread' (0x12f8) hat mit Code 3 (0x3) geendet.
Das Programm "[4156] SDL_Game.exe: Systemeigen" wurde mit Code 3 (0x3) beendet.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

09.07.2012, 18:42

Liegt die .jpg Datei auch im richtigen Ordner?

Btw: exit() verwendet man in C++ nicht ;)

8

09.07.2012, 18:44

Ja, definitiv. Die level1.bmp habe ich auch selber erstellt und diese liegt im gleichen Ordner und wird ja korrekt eingebunden.


Btw: exit() verwendet man in C++ nicht

Hab ich bisher noch nichts dran geändert, ist noch der Beispielcode aus dem Buch ;)

9

09.07.2012, 19:31

Okay, konnte nun den genauen Fehler finden, jedoch nicht beheben.
Der Fehler wird in der Konsole ausgegeben (da sich die Konsole schließt, musste ich zur rechten Zeit ein Bildschirmfoto machen :D)

Bei PNG Bildern kommt folgender Fehler: Failed loading libpng15.dll: Das angegebene Modul wurde nicht gefunden
Bei PNG Bildern kommt folgender Fehler: Failed loading libjpeg-8.dll: Das angegebene Modul wurde nicht gefunden

Woher bekomme ich diese Bibliotheken? Ich finde zwar diesen Download, dort ist aber keine libpng15.dll erhalten.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Anom21« (09.07.2012, 19:52)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

09.07.2012, 20:56

Also in dem von dir oben verlinkten .zip Archiv sind diese dlls enthalten. Du musst sie natürlich, wie die anderen dlls auch, in das Verzeichnis kopieren, in dem deine exe liegt. Und bedenke, dass du die x86 und nicht die x64 Varianten brauchst...

Werbeanzeige