IMG_Load не был объявлен в этой области SDL 2

Я пытаюсь создать приложение с SDL, и я хотел бы добавить значок в моем окне, но при компиляции я получаю эту ошибку:

error: ‘IMG_Load’ was not declared in this scope
  SDL_Surface * icon_surface = IMG_Load(icon);
                                            ^

Я использую cmake и make для компиляции, вот CMakeLists.txt

cmake_minimum_required (VERSION 2.6)

set(PROJECT_NAME "Engine")


project (${PROJECT_NAME})


SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c++0x")

if( CMAKE_SIZEOF_VOID_P EQUAL 8 )

    MESSAGE( "64 bits compiler detected" )
    SET( EX_PLATFORM 64 )
    SET( EX_PLATFORM_NAME "x64" )

    SET( EXECUTABLE_NAME ${PROJECT_NAME}-x64 )

else( CMAKE_SIZEOF_VOID_P EQUAL 8 ) 

    MESSAGE( "32 bits compiler detected" )
    SET( EX_PLATFORM 32 )
    SET( EX_PLATFORM_NAME "x86" )

    SET( EXECUTABLE_NAME ${PROJECT_NAME}-x86 )

endif( CMAKE_SIZEOF_VOID_P EQUAL 8 )

# The executable file will be generate in the bin/ directory
set(EXECUTABLE_OUTPUT_PATH bin/${CMAKE_BUILD_TYPE})


# All .h files are in the include/ directory
include_directories(
    ../include/
)


# All .cpp files are in the src/ directory
file(
    GLOB_RECURSE
    SOURCE_FILES
    ../src/*
)

add_executable(
    ${EXECUTABLE_NAME}
    ${HEADER_FILES}
    ${SOURCE_FILES}
)

target_link_libraries(
    ${EXECUTABLE_NAME}
    GL
    GLEW 
    SDL2
)

а вот main.cpp

#include <stdio.h>
#include <stdlib.h>

#include <GL/glew.h>
#include <SDL2/SDL.h>
#include <glm/glm.hpp>

using namespace glm;
using namespace std;

SDL_Window * CreateWindow(
    const char * title,
    int x,
    int y,
    int w,
    int h,
    Uint32 flags,
    const char * icon
);

SDL_Renderer * CreateRenderer(
    SDL_Window * window,
    Uint32 flags,
    int r,
    int g,
    int b
);

void Init(Uint32 flags);

int main(void)
{

    Init(SDL_INIT_EVERYTHING);

    SDL_Window * window = CreateWindow("Prism", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, /*SDL_WINDOW_FULLSCREEN_DESKTOP*/ SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL, "../../assets/icon.png");

    SDL_Renderer * renderer = CreateRenderer(window, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC, 0, 0, 0);

    bool end = false;
    SDL_Event events;


    while(!end) {
        SDL_WaitEvent(&events);

        if(events.window.event == SDL_WINDOWEVENT_CLOSE)
            end = true;


        SDL_RenderClear(renderer); // On nettoie l'écran


        SDL_RenderPresent(renderer); // Et on effectue le rendu
    }

    SDL_DestroyWindow(window);

    SDL_Quit();

    return(EXIT_SUCCESS);
}

void Init(Uint32 flags){

    if(SDL_Init(flags) < 0){
        printf("Erreur lors de l'initialisation de la SDL : %s\n", SDL_GetError());
        exit(EXIT_FAILURE);
    }
}

SDL_Window * CreateWindow(const char * title, int x, int y, int w, int h, Uint32 flags, const char * icon)
{
    SDL_Window * window = SDL_CreateWindow(title, x, y, w, h, flags);

    if(window == NULL){
        printf("Erreur lors de la création de la fenêtre : %s\n", SDL_GetError());
        exit(EXIT_FAILURE);
    }

    SDL_Surface * icon_surface = IMG_Load(icon);

    if(icon_surface == NULL){
        printf("Erreur lors de la récupération de l'icone : %s\n", SDL_GetError());
        exit(EXIT_FAILURE);
    }

    SDL_SetWindowIcon(window, icon_surface);
    SDL_FreeSurface(icon_surface);

    SDL_ShowCursor(SDL_DISABLE);
    return window;
}

SDL_Renderer * CreateRenderer(SDL_Window * window, Uint32 flags, int r, int g, int b)
{
    SDL_Renderer * renderer = SDL_CreateRenderer(window, -1, flags);

    if(renderer == NULL){
        printf("Erreur lors de la création du renderer : %s\n", SDL_GetError());
        exit(EXIT_FAILURE);
    }

    if(SDL_SetRenderDrawColor(renderer, r, g, b, 255) < 0){
        printf("Erreur lors de la modification de la couleur de fond du renderer : %s\n", SDL_GetError());
        exit(EXIT_FAILURE);
    }


    return renderer;
}

Я пытался добавить SDL_image.h в каталог include, но я получаю сообщение об ошибке, поскольку компилятор не может найти SDL.h, указанный в SDL_image.h...

Спасибо за вашу помощь!

3 ответа

Решение

Хм... не уверен, но, может быть, попробовать это?

#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>

Включите оба заголовка, в этом порядке.

Помимо включения <SDL2/SDL_image.h> как предложено Джастином Таймом, вы также должны будете предоставить библиотеку (SDL2_image) ссылаться на ваш исполняемый файл в вашем файле cmake, вот так;

target_link_libraries(
    ${EXECUTABLE_NAME}
    GL
    GLEW 
    SDL2
    SDL2_image
)

Я только что проверил ваш код, и он отлично работает с вышеуказанной модификацией. Убедитесь, что ваш "../../assets/icon.png" доступен для вашего исполняемого файла. Надеюсь, это поможет.

Итак, я идиот, потому что я не установил libsdl2-image-2.0-0... Я посмотрел на то, что ты послал мне Gestrong, и я изменил свой CMakeList.txt на следующее:

cmake_minimum_required (VERSION 2.6)

SET(PROJECT_NAME "Engine")


PROJECT(${PROJECT_NAME})


SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c++0x")

INCLUDE(FindPkgConfig)
INCLUDE(FindOpenGL REQUIRED)
INCLUDE(FindGLEW REQUIRED)
INCLUDE(FindSDL REQUIRED)


PKG_SEARCH_MODULE(SDL2 REQUIRED sdl2)
PKG_SEARCH_MODULE(SDL2IMAGE REQUIRED SDL2_image)

INCLUDE_DIRECTORIES(${OPENGL_INCLUDE_DIR})
INCLUDE_DIRECTORIES(${GLEW_INCLUDE_DIR})

SET(EXECUTABLE_OUTPUT_PATH bin/)

INCLUDE_DIRECTORIES(../include/)
INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS})
INCLUDE_DIRECTORIES(${SDL2IMAGE_INCLUDE_DIRS})

FILE(
    GLOB_RECURSE
    SOURCE_FILES
    ../src/*
)


ADD_EXECUTABLE(
    ${PROJECT_NAME}
    ${SOURCE_FILES}
)


TARGET_LINK_LIBRARIES(
    ${PROJECT_NAME}
    ${SDL2_LIBRARIES}
    ${SDL2IMAGE_LIBRARIES}
    ${OPENGL_LIBRARIES}
    ${GLEW_LIBRARIES} 
)

я добавил #include <SDL2/SDL_image.h> в моем коде и теперь он работает:) спасибо!

Другие вопросы по тегам