已安装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.osdl2-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
相关产品推荐
相关产品推荐

