Du bist nicht angemeldet.
Moin zusammen,
ich versuche mich zurzeit an SDL2 über C++ und hänge an einem kleinen Problem, welches ich bis dato nicht lösen konnte. Aktuell habe ich ein funktionierendes Programm geschrieben, welches mir ein weißes Fenster zeigt. Jetzt möchte ich meine erste PNG-Datei hinzufügen und zwar mittels IMG_Load(), allerdings scheint SDL2_image nicht richtig eingebunden zu sein.
In der Headerdatei steht folgendes:
#ifndef Game_hpp
#define Game_hpp
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <iostream>
class Game {
public:
Game();
~Game();
void init(const char* title, int xpos, int ypos, int width, int height, bool fullscreen);
void handleEvents();
void update();
void render();
void clean();
bool running() { return isRunning; }
private:
int cnt;
bool isRunning;
SDL_Window *window;
SDL_Renderer *renderer;
};
#endif
In meiner Game.cpp an entsprechender Stelle:
SDL_Surface* tmpSurface = IMG_Load("assets/player.png");
playerTex = SDL_CreateTextureFromSurface(renderer, tmpSurface);
SDL_FreeSurface(tmpSurface);
sdl2 2.0.8-8 und sdl2_image 2.0.3-1 sind installiert. Ich kompiliere mit diesem Befehl:
g++ -Wall -o game main.cpp Game.cpp -lSDL2 -lSDL2_image
Aber immer erhalte ich den Fehler, dass IMG_Load in diesem Gültigkeitsbereich nicht definiert wurde.
Wie gesagt, bevor ich die drei angegebenen Zeilen Code in meiner Game.cpp hinzugefügt habe und nur mit -lSDL2 kompiliert habe, hat es wunderbar funktioniert. Mit SDL2_image dann nicht mehr, also vermute ich, dass es mit der Bibliothek irgendwelche Schwierigkeiten gibt.
Hoffe, ihr könnt mir weiter helfen!
Ich bedanke mich schon mal im Voraus für eure Hilfe!
Beste Grüße
Marlhin
Offline
... Dann zeig doch mal deine Game.cpp, wenn dort der Fehler auftritt.
Offline
Komplette Game.cpp:
#include "Game.hpp"
SDL_Texture* playerTex;
Game::Game()
{}
Game::~Game()
{}
void Game::init(const char *title, int xpos, int ypos, int width, int height, bool fullscreen)
{
int flags = 0;
if(fullscreen)
{
flags = SDL_WINDOW_FULLSCREEN;
}
if(SDL_Init(SDL_INIT_EVERYTHING) == 0)
{
std::cout << "Subsystems initialized!..." << std::endl;
window = SDL_CreateWindow(title, xpos, ypos, width, height, flags);
if(window)
{
std::cout << "Window created!" << std::endl;
}
renderer = SDL_CreateRenderer(window, -1, 0);
if(renderer)
{
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
std::cout << "Renderer created!" << std::endl;
}
isRunning = true;
SDL_Surface* tmpSurface = IMG_Load("assets/player.png");
playerTex = SDL_CreateTextureFromSurface(renderer, tmpSurface);
SDL_FreeSurface(tmpSurface);
} else {
isRunning = false;
}
}
void Game::handleEvents()
{
SDL_Event event;
SDL_PollEvent(&event);
switch (event.type) {
case SDL_QUIT:
isRunning = false;
break;
default:
break;
}
}
void Game::update()
{
++cnt;
std::cout << cnt << std::endl;
}
void Game::render()
{
SDL_RenderClear(renderer);
// This is where we would add stuff to render
SDL_RenderCopy(renderer, playerTex, NULL, NULL);
SDL_RenderPresent(renderer);
}
void Game::clean()
{
SDL_DestroyWindow(window);
SDL_DestroyRenderer(renderer);
SDL_Quit();
std::cout << "Game cleaned!" << std::endl;
}
main.cpp:
#include "Game.hpp"
Game *game = nullptr;
int main() {
game = new Game();
game->init("HunterEngine", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, false);
while(game->running()) {
game->handleEvents();
game->update();
game->render();
}
game->clean();
return 0;
}
Offline
In deiner Game.cpp fehlt ein
#include <SDL2/SDL_image.h>
Bei mit funktioniert das Kompilieren auch ohne den besagten Include:
$ sha256sum *
da4d0063b3d98ea9e20f2a5818d0c8767dc5b40d00b421a257943249edc09930 Game.cpp
dc602eb82288769e380f20904e5bc691366d53fc59b47f91c19645b1f377b1f4 Game.hpp
2e082491683a40ca4a5706aa083c25759db7b41ed2c73bb7715a495b8f2991a9 main.cpp
$ g++ -Wall -o game main.cpp Game.cpp -lSDL2 -lSDL2_image
$ echo $?
0
$ sha256sum game
800e3172a2d8bab62b9e52e42c0d489938b669f68509dcc5838509fb8d9a6bec game
Ich habe folgendes installiert:
$ pacman -Qs sdl
local/sdl 1.2.15-9
A library for portable low-level access to a video framebuffer, audio output, mouse, and keyboard
local/sdl2 2.0.8-8
A library for portable low-level access to a video framebuffer, audio output, mouse, and keyboard (Version 2)
local/sdl2_image 2.0.3-1
A simple library to load images of various formats as SDL surfaces (Version 2)
local/sdl2_ttf 2.0.14-1
A library that allows you to use TrueType fonts in your SDL applications (Version 2)
local/sdl_ttf 2.0.11-4
A library that allows you to use TrueType fonts in your SDL applications
$ g++ --version
g++ (GCC) 8.1.1 20180531
Copyright (C) 2018 Free Software Foundation, Inc.
Dies ist freie Software; die Kopierbedingungen stehen in den Quellen. Es
gibt KEINE Garantie; auch nicht für MARKTGÄNGIGKEIT oder FÜR SPEZIELLE ZWECKE.
Beitrag geändert von schard (25.06.2018 13:53:49)
Offline
Habe den selben Output, wirklich komisch:
$ pacman -Qs sdl
local/sdl 1.2.15-9
A library for portable low-level access to a video framebuffer, audio
output, mouse, and keyboard
local/sdl2 2.0.8-8
A library for portable low-level access to a video framebuffer, audio
output, mouse, and keyboard (Version 2)
local/sdl2_image 2.0.3-1
A simple library to load images of various formats as SDL surfaces (Version
2)
local/sdl2_ttf 2.0.14-1
A library that allows you to use TrueType fonts in your SDL applications
(Version 2)
local/sdl_ttf 2.0.11-4
A library that allows you to use TrueType fonts in your SDL applications
$ g++ --version
g++ (GCC) 8.1.1 20180531
Copyright (C) 2018 Free Software Foundation, Inc.
Dies ist freie Software; die Kopierbedingungen stehen in den Quellen. Es
gibt KEINE Garantie; auch nicht für MARKTGÄNGIGKEIT oder FÜR SPEZIELLE ZWECKE.
Trotzdem erhalte ich:
$ g++ -Wall -o Test main.cpp Game.cpp -lSDL2 -lSDL2_image
Game.cpp: In Elementfunktion »void Game::init(const char*, int, int, int, int, bool)«:
Game.cpp:37:29: Fehler: »IMG_Load« wurde in diesem Gültigkeitsbereich nicht definiert
SDL_Surface* tmpSurface = IMG_Load("assets/player.png");
^~~~~~~~
Beitrag geändert von Marlhin (25.06.2018 14:03:42)
Offline
Blöde Frage: Hast du eventuell ein Kernelupdate gemacht und nicht neu gestartet?
test "$(pacman -Q linux | cut -d " " -f 2)-ARCH" == "$(uname -r)"
PS: Auf welcher Architektur kompilierst du denn? Ich bin auf Intel 64.
Beitrag geändert von schard (25.06.2018 14:12:17)
Offline
Nope, hatte kein Kernelupdate in den letzten paar Tagen und neugestartet hatte ich trotzdem vorhin nochmal.
Bin ebenfalls auf Intel 64 bit.
Hier nochmal ein paar Daten, vielleicht helfen die ja weiter.
OS: Arch Linux x86_64
Host: MS-7971 1.0
Kernel: 4.17.2-1-ARCH
Uptime: 1 hour, 49 mins
Shell: bash 4.4.23
DE: Xfce
CPU: Intel i5-6600K (4) @ 3.900GHz
GPU: NVIDIA GeForce GTX 1070
Memory: 1165MiB / 16005MiB
Offline
Habe das Ganze mal auf meinem Laptop, auf dem auch Arch läuft, versucht und dort klappt es. Ebenfalls eine Intel-CPU, allerdings von der 8000er Serie.
Das ist wirklich sehr merkwürdig. Ich bin mit meinem Latein wirklich am Ende, was dieses Problem betrifft.
Offline