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