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

Ubuntu 22.04.4 LTS下调用SDL_Quit()触发段错误问题求助

SDL2调用SDL_Quit()触发段错误的解决思路

问题背景

在Ubuntu 22.04.4 LTS环境下使用SDL2库时,调用SDL_Quit()会触发段错误,gdb回溯显示错误出现在___pthread_mutex_lock()函数中。仅当执行SDL_CreateWindow()后才会触发该问题,不创建窗口则程序运行正常。

复现代码

#include <SDL2/SDL.h>

int main(void)
{                                                                
    SDL_Init(SDL_INIT_VIDEO);
    SDL_Window *screen = SDL_CreateWindow("test", 100, 100, 680, 550, 0);
    SDL_DestroyWindow(screen);
    SDL_Quit();
    return 0;
}

编译命令

gcc test.c `sdl-config --cflags --libs` -lSDL2main -lSDL2 -Wall -pedantic -std=gnu99 -o test

解决思路

1. 修正编译链接配置

你的编译命令存在两个关键问题:

  • 使用了sdl-config(对应SDL 1.x的配置工具),而非SDL2专用的sdl2-config,这会导致链接参数不匹配。
  • 重复添加-lSDL2main -lSDL2,且顺序不符合SDL2的链接要求(-lSDL2main必须在-lSDL2之前,且位于源文件之后)。

正确的编译命令应为:

gcc test.c -Wall -pedantic -std=gnu99 `sdl2-config --cflags --libs` -o test

2. 规范SDL初始化与退出流程

  • 必须检查SDL_Init()的返回值,避免初始化失败后继续执行后续代码:
    if (SDL_Init(SDL_INIT_VIDEO) != 0) {
        fprintf(stderr, "SDL初始化失败: %s\n", SDL_GetError());
        return 1;
    }
    
  • 销毁窗口后将指针置空,避免野指针风险:
    SDL_DestroyWindow(screen);
    screen = NULL;
    

3. 检查SDL2库的完整性

若上述调整无效,可重新安装SDL2开发包,确保库文件适配Ubuntu 22.04:

sudo apt purge libsdl2-dev libsdl2-2.0-0
sudo apt install libsdl2-dev libsdl2-2.0-0

4. 调整子系统退出顺序

对于复杂场景,可先退出视频子系统再调用SDL_Quit():

SDL_QuitSubSystem(SDL_INIT_VIDEO);
SDL_Quit();

内容的提问来源于stack exchange,提问作者Marc Mennes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 20:32:42