Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ ‘;IMG#U负载’;未在此作用域SDL 2中声明_C++_Sdl 2_Sdl Image - Fatal编程技术网

C++ ‘;IMG#U负载’;未在此作用域SDL 2中声明

C++ ‘;IMG#U负载’;未在此作用域SDL 2中声明,c++,sdl-2,sdl-image,C++,Sdl 2,Sdl Image,我正在尝试使用SDL创建应用程序,我想在我的窗口上添加一个图标,但编译时出现以下错误: error: ‘IMG_Load’ was not declared in this scope SDL_Surface * icon_surface = IMG_Load(icon); ^ 我正在使用cmake进行编译,这里是CMakeLists.txt cmake_minimum_required (VERSIO

我正在尝试使用SDL创建应用程序,我想在我的窗口上添加一个图标,但编译时出现以下错误:

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;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间glm;
使用名称空间std;
SDL_窗口*创建窗口(
常量字符*标题,
int x,
INTY,
int w,
int h,
Uint32旗帜,
常量字符*图标
);
SDL_渲染器*CreateRenderer(
SDL_窗口*窗口,
Uint32旗帜,
INTR,
int g,
int b
);
void Init(Uint32标志);
内部主(空)
{
初始化(SDL_Init_EVERYTHING);
SDL_Window*Window=CreateWindow(“棱镜”,SDL_WINDOWPOS_居中,SDL_WINDOWPOS_居中,800,600,/*SDL_Window_全屏桌面*/SDL_Window_显示| SDL_Window_OPENGL,../../assets/icon.png”);
SDL_Renderer*Renderer=CreateRenderer(窗口,SDL_Renderer_加速| SDL_Renderer_PRESENTVSYNC,0,0,0);
bool end=false;
SDL_事件;
当(!结束){
SDL_WaitEvent(&events);
if(events.window.event==SDL\u WINDOWEVENT\u CLOSE)
结束=真;
SDL_RenderClear(渲染器);//在nettoie l’écran上
SDL_RenderPresent(渲染器);//效果上的Et
}
SDL_窗口(窗口);
SDL_退出();
返回(退出成功);
}
void Init(Uint32标志){
if(SDL_Init(标志)<0){
printf(“SDL初始化错误:%s\n”,SDL_GetError());
退出(退出失败);
}
}
SDL_窗口*创建窗口(常量字符*标题、整数x、整数y、整数w、整数h、Uint32标志、常量字符*图标)
{
SDL_Window*Window=SDL_CreateWindow(标题、x、y、w、h、标志);
如果(窗口==NULL){
printf(“错误:%s\n”,SDL_GetError());
退出(退出失败);
}
SDL_表面*图标_表面=IMG_载荷(图标);
如果(图标曲面==NULL){
printf(“电子邮件地址错误:%s\n”,SDL_GetError());
退出(退出失败);
}
SDL_设置窗口图标(窗口、图标表面);
SDL_自由曲面(图标_曲面);
SDL_显示光标(SDL_禁用);
返回窗口;
}
SDL_渲染器*CreateRenderer(SDL_窗口*窗口,Uint32标志,int r,int g,int b)
{
SDL_Renderer*Renderer=SDL_CreateRenderer(窗口,-1,标志);
if(渲染器==NULL){
printf(“渲染器错误:%s\n”,SDL_GetError());
退出(退出失败);
}
如果(SDL_SetRenderDrawColor(渲染器,r,g,b,255)<0){
printf(“对渲染器进行修改的错误:%s\n”,SDL_GetError());
退出(退出失败);
}
返回渲染器;
}
我试图在include目录中添加SDL_image.h,但出现错误,因为编译器无法找到SDL_image.h中指定的SDL.h


谢谢你的帮助

嗯。。。不确定,但也许试试这个

#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#包括
#包括
按照这个顺序包含两个标题。

除了Justin Time建议的包含
之外,您还必须提供库(
SDL2_image
)来链接cmake文件中的可执行文件,如下所示

target_link_libraries(
    ${EXECUTABLE_NAME}
    GL
    GLEW 
    SDL2
    SDL2_image
)
我刚刚测试了您的代码,经过上述修改后运行良好。确保您的可执行文件可以访问您的
。/../assets/icon.png“
。希望有帮助。

好的 所以我是个白痴,因为我没有安装
libsdl2-image-2.0-0
。。。我看了你寄给我的东西,我将我的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
,现在它可以工作了:)谢谢

不,不起作用。。。编译器找不到它。。。我试图修改SDL_图像中的所有include。h remplaceing
#include“SDL.h”
by
#include
,但我得到了另一个error@LittleStrongMind不要更改SDL\U image.h。更改
main.cpp
SDL.h
SDL\u image.h
应该在同一个文件夹中,因此
SDL\u image.h
包含
SDL.h
而不是
SDL/SDL.h
是正确的。我正在尝试更改文件夹的组织方式和
CMakeLists。txt
为了避免使用发行版上安装的libs,我将在几分钟后测试您的解决方案。您应该在CMakelists.txt中更改一些设置。尝试将sdl2与文件中的pkgconfig一起使用,以便为您设置正确的搜索路径。对于sdl2和sdl都必须这样做_image2@Gerstrong你能给我举个例子吗?这是我第一次使用cmake,所以我对您的图标图像,
“./../assets/icon.png”
是否可以从您的构建目录访问感到不舒服?否则你的可执行文件将找不到它并崩溃。这就是答案,我犯了同样的错误。还应安装SDL_映像版本2的更新版本,该版本能够与SDLv2一起使用。