配置到完成启动界面(十秒)
命令
bash
git clone https://gitcode.com/ZhangRelay1/DungeonRushDemo.git && sudo apt install libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-net-dev libsdl2-ttf-dev -y && cd DungeonRushDemo && mkdir build && cd build && cmake .. && make && cd bin && ./dungeon_rush


这篇文章详细讲解了DungeonRushDemo游戏项目的CMake配置和开发要点。主要内容包括:
-
CMake配置文件逐行解析,涵盖版本要求、项目设置、SDL2库查找、编译输出路径设置等关键指令
-
项目技术栈说明:Linux C语言+CMake+SDL2开发2D游戏
-
核心开发知识点:
- C语言基础(结构体、指针、多文件编程)
- CMake构建系统原理和工作流程
- SDL2多媒体库功能(窗口、渲染、输入、音效等)
- 游戏开发核心逻辑(主循环、碰撞检测、状态机)
- 完整项目构建和运行命令说明
文章通过实际项目案例,系统性地介绍了Linux环境下使用C语言和SDL2开发游戏的全流程,特别适合想要学习游戏开发和CMake构建系统的开发者参考。
cpp
cmake_minimum_required(VERSION 3.5.1)
project(DungeonRush)
# Add SDL2 CMake modules
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/sdl2)
# Set output path
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
# Find SDL2
find_package(SDL2 REQUIRED)
find_package(SDL2_image REQUIRED)
find_package(SDL2_net REQUIRED)
find_package(SDL2_mixer REQUIRED)
find_package(SDL2_ttf REQUIRED)
set(BIN_NAME dungeon_rush)
file(GLOB SRC src/*.c)
add_executable(${BIN_NAME} ${SRC})
target_include_directories(${BIN_NAME} PUBLIC src)
target_include_directories(${BIN_NAME} PUBLIC ${SDL2_INCLUDE_DIR})
target_link_libraries(${BIN_NAME} SDL2::Main SDL2::Net SDL2::Image SDL2::Mixer
SDL2::TTF m)
file(COPY res DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
2022:

逐行精讲:DungeonRushDemo 的 CMakeLists.txt
这是Linux C 项目 + SDL2 游戏 最标准、最实用的 CMake 配置,我给你逐行翻译 + 原理 + 作用,彻底讲懂!
你给的代码:
cmake
cmake_minimum_required(VERSION 3.5.1)
project(DungeonRush)
# Add SDL2 CMake modules
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/sdl2)
# Set output path
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
# Find SDL2
find_package(SDL2 REQUIRED)
find_package(SDL2_image REQUIRED)
find_package(SDL2_net REQUIRED)
find_package(SDL2_mixer REQUIRED)
find_package(SDL2_ttf REQUIRED)
set(BIN_NAME dungeon_rush)
file(GLOB SRC src/*.c)
add_executable(${BIN_NAME} ${SRC})
target_include_directories(${BIN_NAME} PUBLIC src)
target_include_directories(${BIN_NAME} PUBLIC ${SDL2_INCLUDE_DIR})
target_link_libraries(${BIN_NAME} SDL2::Main SDL2::Net SDL2::Image SDL2::Mixer
SDL2::TTF m)
file(COPY res DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
一、逐行详细解释
1. cmake_minimum_required(VERSION 3.5.1)
作用 :指定最低 CMake 版本 含义:如果你的系统 CMake 版本低于 3.5.1,直接报错,防止语法不兼容。
2. project(DungeonRush)
作用 :定义项目名称
- 项目名:DungeonRush
- 不影响可执行文件名,只是标识项目
3. list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/sdl2)
超级关键!专门给 SDL2 用的
CMAKE_MODULE_PATH:CMake 查找库配置文件的路径- 这里把项目里的
cmake/sdl2目录加入搜索路径 - 目的:让 CMake 能正确找到 SDL2、SDL_image 等库的配置文件
很多项目编译失败,就是少了这一行!
4. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
作用:设置编译后的可执行文件输出目录
${CMAKE_BINARY_DIR}= 你执行cmake ..的目录(即 build 目录)- 最终输出路径 =
build/bin/ - 所以编译完会在
build/bin/dungeon_rush
好处:
- 不污染源码目录
- 所有编译产物集中在 build,方便清理
5. find_package(XXX REQUIRED)
cmake
find_package(SDL2 REQUIRED)
find_package(SDL2_image REQUIRED)
find_package(SDL2_net REQUIRED)
find_package(SDL2_mixer REQUIRED)
find_package(SDL2_ttf REQUIRED)
作用:让 CMake 自动查找系统安装的库
-
REQUIRED:必须找到,找不到就直接报错 -
对应你安装的依赖: plaintext
libsdl2-dev libsdl2-image-dev libsdl2-net-dev libsdl2-mixer-dev libsdl2-ttf-dev
找不到就会报:
plaintext
SDL2 not found
6. set(BIN_NAME dungeon_rush)
定义变量 :把可执行文件名统一写成 dungeon_rush后面可以用 ${BIN_NAME} 代替,方便修改。
7. file(GLOB SRC src/*.c)
作用:自动匹配 src 目录下所有 .c 文件
src/*.c= 匹配src/下所有.c源文件- 全部存入变量
${SRC}
不用手动一个个写:
plaintext
add_executable(main.c a.c b.c c.c d.c)
大型项目必备!
8. add_executable({BIN_NAME} {SRC})
真正生成可执行文件!
- 用
${SRC}里所有源文件 - 编译出可执行文件:
dungeon_rush
9. target_include_directories
cmake
target_include_directories(${BIN_NAME} PUBLIC src)
target_include_directories(${BIN_NAME} PUBLIC ${SDL2_INCLUDE_DIR})
作用:告诉编译器【头文件在哪里】
src/:项目自己的头文件${SDL2_INCLUDE_DIR}:SDL2 的头文件路径
不加这两行,会报:
plaintext
找不到 SDL.h
找不到 game.h
10. target_link_libraries
cmake
target_link_libraries(${BIN_NAME}
SDL2::Main
SDL2::Net
SDL2::Image
SDL2::Mixer
SDL2::TTF
m
)
最核心:链接所有依赖库!
SDL2::Main→ 链接 libsdl2SDL2::Image→ 链接 libsdl2-imageSDL2::Net→ 链接 libsdl2-netSDL2::Mixer→ 链接 libsdl2-mixerSDL2::TTF→ 链接 libsdl2-ttfm→ 系统数学库(math.h,三角函数、平方根)
不加这一行,会报大量 "未定义引用" 错误!
11. file(COPY res DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
作用:把资源文件夹 res/ 复制到 build/bin/
res/存放图片、音效、字体、地图- 游戏运行必须依赖这些文件
- 自动复制,不用手动拷贝
二、这个 CMakeLists.txt 到底干了什么?(总结)
用最简单的话讲:
- 指定 CMake 版本
- 添加 SDL2 查找路径
- 设置编译输出到 build/bin
- 自动查找 SDL2 相关所有库
- 自动包含 src 下所有 .c 源码
- 告诉编译器头文件路径
- 链接所有 SDL2 库 + 数学库
- 自动复制游戏资源(图片 / 音效)
最终生成:
plaintext
build/bin/dungeon_rush
build/bin/res/
三、你运行的编译命令与 CMake 的对应关系
bash
运行
mkdir build && cd build
cmake ..
make
对应 CMake 工作流程:
cmake ..→ 读取 CMakeLists.txt,生成 Makefilemake→ 根据 Makefile 编译所有 .c 文件- 输出到
build/bin/
四、这个 CMake 配置为什么专业?(重点)
- ** out-of-source 编译 **(编译产物与源码分离)
- 自动搜索源文件
- 自动查找库
- 自动复制资源
- 多平台通用(Linux、Windows、Mac)
- SDL2 游戏项目标准模板
五、一句话记住 CMake 的核心功能
CMake = 自动构建编译流程的工具,帮你自动找库、自动编译、自动链接、自动输出。
你不用手写 Makefile,CMake 帮你写!
超详细:DungeonRushDemo 核心知识点(Linux C + CMake + SDL2)
我用最通俗、最实战 的方式,把这个游戏项目用到的Linux C 编程、CMake 构建、SDL2 游戏开发全部讲清楚,你直接对照项目源码就能看懂。
一、项目整体技术栈
这个项目是 纯 C 语言 + Linux 环境 + CMake 构建 + SDL2 游戏库 开发的贪吃蛇类游戏。
核心技术:
- Linux C 语言编程(基础语法、指针、内存管理、文件操作)
- CMake 构建系统(自动生成 Makefile、跨平台编译)
- SDL2 多媒体库(窗口、图像、声音、网络、输入、渲染)
- 多文件项目结构(模块化、分层设计)
- 游戏逻辑基础(循环、碰撞检测、状态管理)
二、Linux C 语言核心知识点(项目 80% 用到)
1. 标准 C 基础语法
- 变量、数组、结构体、枚举
- 循环
for/while、判断if/switch - 函数、函数指针
- 宏定义
#define
项目里大量使用:
c
运行
#define WINDOW_WIDTH 800
typedef struct { int x, y; } Point;
2. 结构体(游戏核心)
游戏里英雄、怪物、武器、buff、地图全部用结构体描述,这是 C 语言做游戏的灵魂。
示例(项目真实逻辑):
c
运行
// 英雄实体
typedef struct {
int x, y; // 坐标
int type; // 类型(战士/法师/射手)
int hp; // 血量
Weapon weapon; // 装备的武器
} Hero;
3. 指针与动态内存
- 动态数组存储英雄队列(像贪吃蛇身体)
- 动态创建 / 销毁怪物
- 避免内存泄漏
c
运行
Hero* heros = malloc(sizeof(Hero) * 100);
4. 多文件编程(.c + .h)
项目结构一定是:
.h头文件:声明函数、结构体、宏.c源文件:实现逻辑
例如:
plaintext
main.c // 入口
game.c // 游戏逻辑
render.c // 渲染
input.c // 按键输入
entity.c // 实体(英雄/怪物)
优点:代码清晰、易维护、适合大型项目。
5. 头文件保护
c
运行
#ifndef GAME_H
#define GAME_H
// 内容
#endif
防止重复包含,编译报错。
6. 错误处理
- 指针判空
- SDL 函数调用失败检查
- 文件读取判断
7. Linux 系统调用(简单用到)
- 文件读取(资源加载)
- 时间函数(控制帧率)
三、CMake 知识点(项目编译核心)
你运行的:
plaintext
cmake ..
make
就是 CMake 在工作。
1. CMake 是什么?
自动生成 Makefile 的工具,让你不用手写复杂的 Makefile。
2. 项目必须有:CMakeLists.txt
这是 CMake 的配置文件,DungeonRushDemo 里一定有。
3. 最核心的 CMake 指令
cmake
# 最低版本
cmake_minimum_required(VERSION 3.10)
# 项目名
project(DungeonRush C)
# C 标准
set(CMAKE_C_STANDARD 99)
# 查找 SDL2 库
find_package(SDL2 REQUIRED)
find_package(SDL2_image REQUIRED)
# 头文件路径
include_directories(${SDL2_INCLUDE_DIRS})
# 编译成可执行文件
add_executable(dungeon_rush main.c game.c render.c ...)
# 链接库
target_link_libraries(dungeon_rush ${SDL2_LIBRARIES} SDL2_image SDL2_mixer ...)
4. 编译流程原理(超重要)
plaintext
mkdir build && cd build # 建立编译目录
cmake .. # 生成 Makefile
make # 编译
./bin/dungeon_rush # 运行
**为什么要建 build 目录?**保持源码干净,不污染源代码文件夹。
四、SDL2 知识点(游戏运行的基础库)
DungeonRush 完全依赖 SDL2,这是 Linux 下最流行的 2D 游戏开发库。
1. SDL2 能做什么?
- 创建窗口
- 渲染图像
- 监听键盘 / 鼠标
- 播放音乐 / 音效
- 网络通信(多人联机)
- 字体显示
2. 项目用到的 5 大 SDL2 子模块
- SDL2:核心(窗口、事件、渲染)
- SDL2_image:加载图片(PNG/JPG)
- SDL2_mixer:播放声音
- SDL2_net:局域网联机
- SDL2_ttf:显示文字
3. 游戏主循环(最核心)
所有游戏都长这样:
c
运行
while (is_running) {
事件处理(按键)
更新游戏逻辑(移动、碰撞、AI)
渲染画面
控制帧率(60 FPS)
}
4. 常用 SDL2 函数
c
运行
SDL_Init(); // 初始化
SDL_CreateWindow(); // 创建窗口
SDL_CreateRenderer(); // 创建渲染器
SDL_PollEvent(); // 监听按键
SDL_RenderCopy(); // 绘制图片
SDL_Delay(); // 延时
五、游戏本身的逻辑知识点
1. 贪吃蛇式队列
英雄跟随前面的单位移动,用数组 / 链表实现。
2. 碰撞检测
判断:
- 英雄是否吃到道具
- 是否碰到怪物
- 是否碰到敌人
3. 状态机
游戏状态:
- 开始界面
- 游戏中
- 胜利 / 失败
- 暂停
4. 动画与渲染
- 精灵图(Sprite Sheet)
- 帧动画
- 图层渲染(地图→角色→特效)
六、你运行的命令逐行解释(最实用)
bash
运行
# 下载源码
git clone https://gitcode.com/ZhangRelay1/DungeonRushDemo.git
# 安装依赖(SDL2 全套)
sudo apt install libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-net-dev libsdl2-ttf-dev -y
# 进入项目
cd DungeonRushDemo
# 创建编译目录
mkdir build
cd build
# CMake 生成 Makefile
cmake ..
# 编译项目
make
# 运行游戏
cd bin
./dungeon_rush
七、总结(最核心 5 点)
- Linux C:结构体、指针、多文件、内存管理
- CMake:自动构建,生成 Makefile,管理编译
- SDL2:窗口、渲染、输入、声音、网络
- 项目结构:模块化、清晰易扩展
- 游戏原理:主循环 + 碰撞 + 状态管理
如果你愿意,我可以继续教你:
- 逐行读懂项目源码
- 修改游戏数值(速度、血量、关卡)
- 自己加功能(新武器、新怪物)
- 打包发布成 Linux 可执行文件