为什么在使用 SDL3 和 SDL2_image 库加载 .png 文件时出现“SDL2.dll not found”错误

问题描述 投票:0回答:1

要使用 SDL3 和 SDL2_image 库将 .png 文件加载到窗口,我从下面的链接下载了以下代码:

https://lazyfoo.net/tutorials/SDL/06_extension_libraries_and_loading_other_image_formats/sdl3-06_extension_libraries_and_loading_other_image_formats.zip

#include <SDL3/SDL.h>
#include <SDL3/SDL_main.h>
#include <SDL3_image/SDL_image.h>
#include <string>

//Screen dimension constants
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;

//Starts up SDL and creates window
bool init();

//Loads media
bool loadMedia();

//Frees media and shuts down SDL
void close();

//Loads individual image
SDL_Surface* loadSurface( std::string path );

//The window we'll be rendering to
SDL_Window* gWindow = NULL;

//The surface contained by the window
SDL_Surface* gScreenSurface = NULL;

//Current displayed PNG image
SDL_Surface* gPNGSurface = NULL;

bool init()
{
    //Initialization flag
    bool success = true;

    //Initialize SDL
    if( !SDL_Init( SDL_INIT_VIDEO ) )
    {
        SDL_Log( "SDL could not initialize! SDL Error: %s\n", SDL_GetError() );
        success = false;
    }
    else
    {
        //Create window
        gWindow = SDL_CreateWindow( "SDL Tutorial", SCREEN_WIDTH, SCREEN_HEIGHT, 0 );
        if( gWindow == NULL )
        {
            SDL_Log( "Window could not be created! SDL Error: %s\n", SDL_GetError() );
            success = false;
        }
        else
        {
            //Initialize PNG loading
            int imgFlags = IMG_INIT_PNG;
            if( !( IMG_Init( imgFlags ) & imgFlags ) )
            {
                SDL_Log( "SDL_image could not initialize! SDL_image Error: %s\n", SDL_GetError() );
                success = false;
            }
            else
            {
                //Get window surface
                gScreenSurface = SDL_GetWindowSurface( gWindow );
            }
        }
    }

    return success;
}

bool loadMedia()
{
    //Loading success flag
    bool success = true;

    //Load PNG surface
    gPNGSurface = loadSurface( "loaded.png" );
    if( gPNGSurface == NULL )
    {
        SDL_Log( "Failed to load PNG image!\n" );
        success = false;
    }

    return success;
}

void close()
{
    //Free loaded image
    SDL_DestroySurface( gPNGSurface );
    gPNGSurface = NULL;

    //Destroy window
    SDL_DestroyWindow( gWindow );
    gWindow = NULL;

    //Quit SDL subsystems
    IMG_Quit();
    SDL_Quit();
}

SDL_Surface* loadSurface( std::string path )
{
    //The final optimized image
    SDL_Surface* optimizedSurface = NULL;

    //Load image at specified path
    SDL_Surface* loadedSurface = IMG_Load( path.c_str() );
    if( loadedSurface == NULL )
    {
        SDL_Log( "Unable to load image %s! SDL_image Error: %s\n", path.c_str(), SDL_GetError() );
    }
    else
    {
        //Convert surface to screen format
        optimizedSurface = SDL_ConvertSurface( loadedSurface, gScreenSurface->format );
        if( optimizedSurface == NULL )
        {
            SDL_Log( "Unable to optimize image %s! SDL Error: %s\n", path.c_str(), SDL_GetError() );
        }

        //Get rid of old loaded surface
        SDL_DestroySurface( loadedSurface );
    }

    return optimizedSurface;
}

int main( int argc, char* args[] )
{
    //Start up SDL and create window
    if( !init() )
    {
        SDL_Log( "Failed to initialize!\n" );
    }
    else
    {
        //Load media
        if( !loadMedia() )
        {
            SDL_Log( "Failed to load media!\n" );
        }
        else
        {
            //Main loop flag
            bool quit = false;

            //Event handler
            SDL_Event e;

            //While application is running
            while( !quit )
            {
                //Handle events on queue
                while( SDL_PollEvent( &e ) != 0 )
                {
                    //User requests quit
                    if( e.type == SDL_EVENT_QUIT )
                    {
                        quit = true;
                    }
                }

                //Apply the PNG image
                SDL_BlitSurface( gPNGSurface, NULL, gScreenSurface, NULL );

                //Update the surface
                SDL_UpdateWindowSurface( gWindow );
            }
        }
    }

    //Free resources and close SDL
    close();

    return 0;
}

设置 SDL3 和 SDL_Image 库:

  1. 我从下面的链接下载并设置了 SDL3-devel-3.1.6-mingw.zip 文件以进行 SDL3 安装:

https://github.com/libsdl-org/SDL/releases/tag/preview-3.1.6

  1. 我从下面的链接下载并设置了 SDL2_image-devel-2.8.2-mingw.zip 文件以进行 SDL_image 安装:

https://github.com/libsdl-org/SDL_image/releases

  1. 我从SDL3目录下的SDL2_image-2.8.2复制了以下目录。

686-w64-mingw32 x86_64-w64-mingw32 cmake

  1. 我在“SDL3 86-w64-mingw32\include”目录下创建了一个名为“SDL3_image”的目录,并将文件从“SDL_image.h”下面的链接复制到该目录。

https://github.com/libsdl-org/SDL_image/blob/main/include/SDL3_image/SDL_image.h

SDL3 and SDL_Image setup

对于 CodeBlocks 20.03 32 位中的项目设置:

  1. 项目构建选项

Project Build options

  1. 我将以下文件复制到.exe文件目录中。

SDL3.dll SDL2_image.dll

程序编译没有任何问题,但是当我运行它时,它给出错误“SDL2.dll not found”。

除了使用 SDL3 加载 .png 文件之外,其他示例都工作正常。加载 SDL3_image 库时是否存在错误或者我缺少什么?

sdl sdl-image
1个回答
0
投票

SDL2_image
,顾名思义,是针对SDL2的,而不是针对SDL3的。

似乎 SDL3 的 SDL_image 版本尚未发布,但他们确实在其 main

 分支
中支持 SDL3 。所以你必须从源代码构建 SDL_image。

© www.soinside.com 2019 - 2024. All rights reserved.