Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

CMake配置模板

在现代 C++ 开发中,SDL2、OpenGL 和 ImGui 是常见的组合,适合快速开发跨平台图形应用和游戏原型。本文将讲解如何使用 CMake 构建一个模板工程,使项目结构清晰、依赖管理简单、可直接编译运行。其中 SDL2 和 ImGui 通过 add_subdirectory 方式集成,实现源码级管理和可编译模板。使用这种方式,对于2D C++引擎演示,后续方便用 Emscripten 编译到网页,而不是依赖系统库。

项目结构

可以使用这样的文件结构。

MyProject/
├─ CMakeLists.txt
├─ src/
│  ├─ main.cpp
│  └─ App.cpp
├─ include/
│  └─ App.h
├─ external/
│  ├─ imgui/       # ImGui 源码
│  └─ SDL2/        # SDL2 源码(官方 SDL2 或 git 子模块)
└─ build/          # CMake 构建目录

CMake基础配置

cmake_minimum_required(VERSION 3.25)
project(MyProject VERSION 1.0 LANGUAGES CXX)

# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# 设置默认构建类型
if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release)
endif()

添加源文件

file(GLOB_RECURSE SOURCES "src/*.cpp")
file(GLOB_RECURSE HEADERS "include/*.h")

add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS})

集成SDL

# 添加 SDL2 子目录
add_subdirectory(external/SDL2)

# 链接 SDL2 到主程序
target_link_libraries(${PROJECT_NAME} PRIVATE SDL2::SDL2 SDL2::SDL2main)

OpenGL支持

find_package(OpenGL REQUIRED)

target_include_directories(${PROJECT_NAME} PRIVATE ${OPENGL_INCLUDE_DIR})
target_link_libraries(${PROJECT_NAME} PRIVATE ${OPENGL_LIBRARIES})

集成ImGui

set(IMGUI_DIR "${CMAKE_SOURCE_DIR}/external/imgui")

# 添加 ImGui 子目录
add_subdirectory(${IMGUI_DIR})

# 链接 ImGui 到主程序
target_link_libraries(${PROJECT_NAME} PRIVATE imgui)

# 添加 ImGui 头文件搜索路径
target_include_directories(${PROJECT_NAME} PRIVATE 
    ${IMGUI_DIR} 
    ${IMGUI_DIR}/backends
)

代码示例

#include "App.h"
#include "imgui.h"
#include "backends/imgui_impl_sdl.h"
#include "backends/imgui_impl_opengl3.h"
#include <SDL.h>
#include <SDL_opengl.h>

int main(int argc, char** argv)
{
    App app;
    if (!app.Init()) return -1;
    app.Run();
    app.Shutdown();
    return 0;
}

Build

mkdir build
cd build
cmake ..
cmake --build .
./MyProject   # Linux/macOS
MyProject.exe # Windows