You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 14:57:52