#1 25.06.2018 12:37:20

Marlhin
Mitglied

C++/SDL2 IMG_Load wurde in diesem Gültigkeitsbereich nicht definiert

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

#2 25.06.2018 12:49:41

schard
Mitglied

Re: C++/SDL2 IMG_Load wurde in diesem Gültigkeitsbereich nicht definiert

... Dann zeig doch mal deine Game.cpp, wenn dort der Fehler auftritt.

Offline

#3 25.06.2018 13:28:41

Marlhin
Mitglied

Re: C++/SDL2 IMG_Load wurde in diesem Gültigkeitsbereich nicht definiert

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

#4 25.06.2018 13:44:11

schard
Mitglied

Re: C++/SDL2 IMG_Load wurde in diesem Gültigkeitsbereich nicht definiert

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

#5 25.06.2018 14:02:10

Marlhin
Mitglied

Re: C++/SDL2 IMG_Load wurde in diesem Gültigkeitsbereich nicht definiert

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

#6 25.06.2018 14:06:13

schard
Mitglied

Re: C++/SDL2 IMG_Load wurde in diesem Gültigkeitsbereich nicht definiert

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

#7 25.06.2018 14:16:47

Marlhin
Mitglied

Re: C++/SDL2 IMG_Load wurde in diesem Gültigkeitsbereich nicht definiert

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

#8 26.06.2018 13:08:33

Marlhin
Mitglied

Re: C++/SDL2 IMG_Load wurde in diesem Gültigkeitsbereich nicht definiert

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

Schnellantwort auf dieses Thema

Schreibe deinen Beitrag und versende ihn
Deine Antwort

Fußzeile des Forums