SDL_Image 图书馆使程序崩溃或使它们行为不端

SDL_Image library crashes programs or makes them misbehave

我有一个 sdl2 程序,它在我的机器上运行良好(win xp 32 位)。当我将它发送给我的朋友(win 10 64 位)时,程序显示 SetRenderDrawColor 并在几秒钟后崩溃。 此程序使用 SDL2 和 SDL2_Image.

然后我从网站上复制了一个准系统sdl2程序。 它适用于我们的两台计算机。

然后我修改了程序以使用 SDL_Image 库中的 IMG_Load,这在我这边再次工作正常,但这次没有崩溃,而是只显示集合RenderDrawColor 但不是加载的图像,并在 SDL_Delay 在我朋友的计算机上完成后关闭。

我使用的编译命令是:

g++ main.cpp -lSDL2 -lSDL2main -lSDL_Image -static-libgcc -static-libstdc++ -o main.exe

此外,如果我没有#define SDL_MAIN_HANDLED,我会说在我的 win7 或 win xp 计算机上没有 sdl2 程序可以运行。但是我遇到的教程都没有说我需要使用这样的东西。

有什么帮助吗?

编辑:发布准系统程序代码

#define SDL_MAIN_HANDLED

#include <SDL2/SDL.h>
#include <SDL2/SDL_Image.h>
#include <iostream>

int main( int argc, char* args[] )
{
    int posX = 100;
    int posY = 200;
    int sizeX = 300;
    int sizeY = 400;
    SDL_Window* window;
    SDL_Renderer* renderer;
    SDL_Event event;

    // Initialize SDL
    // ==========================================================
    if ( SDL_Init( SDL_INIT_EVERYTHING ) != 0 )
    {
        // Something failed, print error and exit.
        std::cout << " Failed to initialize SDL : " << SDL_GetError() << std::endl;
        return -1;
    }

    // Initialize SDL_Image
    int flags = IMG_INIT_JPG|IMG_INIT_PNG;
    int initted = IMG_Init(flags);

    if((initted&flags) != flags)
    {
      printf("IMG_Init: Failed to init required jpg and png support!\n");
      printf("IMG_Init: %s\n", IMG_GetError());
    }

    // Create and init the window
    // ==========================================================
    window = SDL_CreateWindow( "test", posX, posY, sizeX, sizeY, 0 );

    if ( window == nullptr )
    {
        std::cout << "Failed to create window : " << SDL_GetError();
        return -1;
    }

    // Create and init the renderer
    // ==========================================================
    renderer = SDL_CreateRenderer( window, -1, SDL_RENDERER_ACCELERATED );

    if ( renderer == nullptr )
    {
        std::cout << "Failed to create renderer : " << SDL_GetError();
        return -1;
    }

    // Render something
    // ==========================================================    
    // Load image
    SDL_Surface* loader = IMG_Load("background.jpg");
    SDL_Texture* sprite = SDL_CreateTextureFromSurface(renderer, loader);

    if(loader == NULL)
    {
       std::cout << "Loader failed!" << std::endl << std::endl;
       IMG_GetError();
    }
    // Set size of renderer to the same as window
    SDL_RenderSetLogicalSize( renderer, sizeX, sizeY );

    // Set color of renderer to red
    SDL_SetRenderDrawColor( renderer, 255, 0, 0, 255 );

    // Clear the window and make it all red
    SDL_RenderClear( renderer );

    // Draw image
    SDL_RenderCopy(renderer, sprite, 0, 0);

    // Render the changes above ( which up until now had just happened behind the scenes )
    SDL_RenderPresent( renderer);

    // Pause program so that the window doesn't disappear at once.

    while(true)
    {
      SDL_PollEvent(&event);

      if(event.type == SDL_QUIT) return 0;

      SDL_Delay( 10 );
    }

    return 0;
}

通过将 MingGW 安装中的 libpng16-16.dll and zlib1.dll 添加到分布式文件夹中解决了问题。

如果其他人遇到此问题,则此操作所需的 .dll 总数为:

SDL2.dll | SDL2_Image.dll | libwinpthread-1.dll | libpng16-16.dll| zlib1.dll.