You need to enable JavaScript to run this app. 已安装SDL2开发包、用sdl2-config链接时GCC编译C程序报错
优惠活动
大模型
产品
解决方案
定价
更多

已安装SDL2开发包、用sdl2-config链接时GCC编译C程序报错

报错根因说明

你遇到的编译问题和SDL2开发依赖包是否安装完整没有关系,从报错类型(编译阶段找不到函数声明、找不到宏定义)就能判断,编译器已经正确定位到SDL2的头文件路径,不存在头文件配置错误、依赖缺失的问题。
核心原因是代码使用的是已被SDL2彻底移除的SDL 1.2版本专属API:

  • SDL_SetVideoMode 是SDL 1.2时代用于创建显示窗口的旧接口,SDL2从架构重构阶段就将这个函数完全删除,不会在SDL2的头文件中做任何导出,编译器才会提示“找不到函数声明”
  • 配套的SDL_HWSURFACE是SDL1.2用来标记硬件加速显示表面的宏定义,SDL2的窗口、表面管理逻辑完全重写,这个宏根本不存在,编译器才会就近提示相似名字的SDL_SWSURFACE做参考。
    这类报错通常是因为参考了出版时间较早、基于SDL 1.2写的老旧教程代码,直接照搬就会出现这类找不到符号的问题。
之前操作的两个可修正的小疏漏
  • 安装命令笔误:写的apt-get-install不符合shell命令语法,正确的apt安装命令格式是apt-get install,命令和后续包名之间不需要加横杠
  • 编译命令的输出名问题:写的gcc main.c -o main.o sdl2-config --cflags --libs`` 会把最终生成的可执行文件直接命名为带.o后缀的文件(.o后缀本来是用来存储不完整链接信息的中间目标文件),编译完成后直接运行容易出现认知混淆,建议把输出文件名改成普通可执行文件名,比如-o sdl2_demo
适配SDL2版本的正确代码

替换掉原代码里不符合SDL2接口的部分,完整可编译运行的代码如下:

#include <SDL2/SDL.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    // 初始化视频子系统
    if (SDL_Init(SDL_INIT_VIDEO) != 0) {
        SDL_Log("SDL初始化失败: %s", SDL_GetError());
        return EXIT_FAILURE;
    }

    // 替代SDL1.2的SDL_SetVideoMode,创建居中的640*480窗口
    SDL_Window *window = SDL_CreateWindow(
        "SDL2 Test Window",
        SDL_WINDOWPOS_CENTERED,
        SDL_WINDOWPOS_CENTERED,
        640, 480,
        0
    );
    if (window == NULL) {
        SDL_Log("窗口创建失败: %s", SDL_GetError());
        SDL_Quit();
        return EXIT_FAILURE;
    }

    // 保持窗口展示3秒
    SDL_Delay(3000);

    // 释放资源退出
    SDL_DestroyWindow(window);
    SDL_Quit();
    return EXIT_SUCCESS;
}
编译运行

直接用你原本的编译逻辑,修正输出文件名即可:

gcc main.c -o sdl2_demo `sdl2-config --cflags --libs`
# 运行生成的可执行文件
./sdl2_demo

内容的提问来源于stack exchange,提问作者Oronce SOSSOU

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 06:57:00