使用CMake链接SDL_Image后程序运行即退出问题求助
问题描述
在Windows 11系统中使用最新版MinGW(mingw32-make),通过CMake配置SDL2和SDL_Image(均基于各自的SDL2分支)。添加IMG_Init(IMG_INIT_PNG | IMG_INIT_JPG);语句后,程序运行无任何反应(既不崩溃也不执行);将SDL2作为共享库链接时也出现同样问题。仅静态链接SDL2时程序可正常运行。
CMakeLists.txt配置
## Setup cmake_minimum_required(VERSION 3.27.9) project(Pacman LANGUAGES CXX) ## SDL2 add_subdirectory("external/SDL2") ## SDL_image add_subdirectory("external/SDL_image") ## Compile add_executable(${PROJECT_NAME} "src/main.cpp") target_link_libraries(${PROJECT_NAME} SDL2::SDL2-static SDL2_image::SDL2_image)
测试代码
#define SDL_MAIN_HANDLED #include <SDL2/SDL.h> #include <SDL_image.h> #include <iostream> int main(int argc, char *argv[]) { SDL_Init(SDL_INIT_VIDEO); SDL_Window *window = SDL_CreateWindow( "Pacman", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 1920, 1080, 0 ); SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_SOFTWARE); SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE); SDL_RenderClear(renderer); SDL_RenderPresent(renderer); // 取消注释IMG_Init后此语句也无法执行 printf("working up to here"); // 问题代码行 // // Initialize PNG loading // IMG_Init(IMG_INIT_PNG | IMG_INIT_JPG); SDL_Delay(3000); SDL_DestroyWindow(window); SDL_Quit(); return 0; }
解决方法
强制静态链接SDL_Image
默认的SDL2_image::SDL2_image可能指向动态库目标,Windows下动态链接需要依赖的dll文件存在,静态链接可避免此问题。修改CMakeLists.txt中的链接语句:target_link_libraries(${PROJECT_NAME} SDL2::SDL2-static SDL2_image::SDL2_image-static)添加初始化错误检查
为SDL和SDL_Image的初始化添加错误检查,定位具体问题:// 检查SDL初始化 if (SDL_Init(SDL_INIT_VIDEO) != 0) { printf("SDL初始化失败: %s\n", SDL_GetError()); return 1; } // ... 窗口、渲染器创建代码 ... // 检查SDL_image初始化 int imgFlags = IMG_INIT_PNG | IMG_INIT_JPG; int initResult = IMG_Init(imgFlags); if ((initResult & imgFlags) != imgFlags) { printf("SDL_image初始化失败: %s\n", IMG_GetError()); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); return 1; }确保SDL_Image依赖静态编译
在编译SDL_Image前强制开启静态构建,确保其依赖的libpng、libjpeg等库也被静态链接:set(SDL2IMAGE_BUILD_STATIC ON CACHE BOOL "" FORCE) add_subdirectory("external/SDL_image")清理CMake缓存重新编译
删除build目录,重新执行cmake ..和mingw32-make,避免缓存导致的依赖配置错误。
内容的提问来源于stack exchange,提问作者Eran Stockdale
相关产品推荐
相关产品推荐

