2016-02-04 14 views
2

我試圖與SDL的應用程序,我想我的窗口上添加一個圖標,但我編譯時出現此錯誤:「IMG_Load」在此範圍SDL未聲明2

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

我'使用的cmake 使編譯,這裏是的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在包括目錄,但我得到一個錯誤,因爲編譯器不能找到在SDL_image.h指定的SDL.h ...

感謝您的幫助!

回答

3

嗯...不知道,但也許試試這個?

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

按此順序包括兩個標題。

+0

Nope無法正常工作......編譯器無法找到它......我嘗試修改所有包含在** SDL_image.h **中的'#include「SDL.h」''#'include '但我得到另一個錯誤 – LittleStrongMind

+0

@LittleStrongMind請勿更改'SDL_image.h'。改變'main.cpp'。 'SDL.h'和'SDL_image.h'應該在同一個文件夾中,所以'SDL_image.h'在包含'SDL.h'而不是'SDL/SDL.h'中是正確的。 –

+0

我試圖改變我的文件夾的組織方式和'CMakeLists。 txt'以避免使用分發版上安裝的庫,我會在幾分鐘內測試您的解決方案。 – LittleStrongMind

2

除了Justin Time建議的包含<SDL2/SDL_image.h>之外,您還必須提供庫(SDL2_image)以鏈接您的cmake文件中的可執行文件,就像這樣;

target_link_libraries(
    ${EXECUTABLE_NAME} 
    GL 
    GLEW 
    SDL2 
    SDL2_image 
) 

我剛剛測試了你的代碼,它在上面的修改中運行正常。確保您的可執行文件可以訪問您的"../../assets/icon.png"。希望有所幫助。

+0

也不能用... – LittleStrongMind

+0

是你的圖標圖像,''../../ assets/icon.png「'可以從你的編譯目錄訪問嗎?否則,您的可執行文件將無法找到它並且會崩潰。 – share

1

好 所以我是個白癡,因爲我沒有安裝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>,現在它工作:)謝謝!