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
.
我有一个 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
.