如何在2D游戏引擎的CMake构建配置中集成SDL3、SDLRenderer3与ImGui并生成可用的config.cmake
如何在2D游戏引擎的CMake构建配置中集成SDL3、SDLRenderer3与ImGui并生成可用的config.cmake
我来帮你搞定这个问题!要让你的MyEngine集成SDL3、SDLRenderer3和ImGui,并且让用户只用find_package(MyEngine)就能直接用,不用操心这些依赖,咱们一步步来操作:
第一步:把SDL3和ImGui引入引擎构建流程
推荐用FetchContent模块自动拉取依赖源码,这样你的引擎就能自包含这些依赖,用户不用提前手动安装它们。
在你的CMakeLists.txt最开头添加以下配置:
# 引入FetchContent模块,用于自动拉取依赖源码 include(FetchContent) # 拉取SDL3(指定稳定版本标签,避免用main分支的不稳定代码) FetchContent_Declare( SDL3 GIT_REPOSITORY https://github.com/libsdl-org/SDL.git GIT_TAG release-3.0.0 # 可以换成你需要的SDL3稳定版本 ) FetchContent_MakeAvailable(SDL3) # 拉取ImGui并配置SDL3渲染器后端 FetchContent_Declare( imgui GIT_REPOSITORY https://github.com/ocornut/imgui.git GIT_TAG v1.90.4 # 选一个稳定的ImGui版本 ) FetchContent_MakeAvailable(imgui) # 把ImGui的SDL3后端封装成静态库 add_library(imgui_backends STATIC ${imgui_SOURCE_DIR}/backends/imgui_impl_sdl3.cpp ${imgui_SOURCE_DIR}/backends/imgui_impl_sdlrenderer3.cpp ) target_include_directories(imgui_backends PUBLIC ${imgui_SOURCE_DIR} ${imgui_SOURCE_DIR}/backends ${SDL3_INCLUDE_DIRS} ) target_link_libraries(imgui_backends PUBLIC imgui::imgui SDL3::SDL3 SDL3::SDL3_renderer ) # 封装ImGui核心库为CMake目标 add_library(imgui_core STATIC ${imgui_SOURCE_DIR}/imgui.cpp ${imgui_SOURCE_DIR}/imgui_demo.cpp ${imgui_SOURCE_DIR}/imgui_draw.cpp ${imgui_SOURCE_DIR}/imgui_tables.cpp ${imgui_SOURCE_DIR}/imgui_widgets.cpp ) add_library(imgui::imgui ALIAS imgui_core) target_include_directories(imgui_core PUBLIC ${imgui_SOURCE_DIR})
第二步:把依赖链接到你的引擎子库
现在要让你的Engine、Player、World这些库都能用上SDL3和ImGui,修改原有的foreach循环,添加链接逻辑:
# 为每个引擎子库配置包含目录+依赖链接 foreach(lib Engine Player World) target_include_directories(${lib} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> ) # 把SDL3、SDLRenderer3和ImGui链接到子库,用PUBLIC确保依赖能传递给用户项目 target_link_libraries(${lib} PUBLIC SDL3::SDL3 SDL3::SDL3_renderer imgui::imgui imgui_backends ) endforeach()
第三步:确保依赖信息能随引擎安装导出
要让用户的find_package(MyEngine)能自动识别这些依赖,需要调整MyEngine-config.cmake.in和安装配置:
1. 修改MyEngine-config.cmake.in
在文件里添加依赖查找逻辑,确保用户项目能自动获取SDL3和ImGui:
@PACKAGE_INIT@ # 导入MyEngine的核心目标 include("${CMAKE_CURRENT_LIST_DIR}/MyEngineTargets.cmake") # 自动拉取/查找SDL3和ImGui(如果用户环境没有的话) include(FetchContent) if(NOT TARGET SDL3::SDL3) FetchContent_Declare( SDL3 GIT_REPOSITORY https://github.com/libsdl-org/SDL.git GIT_TAG release-3.0.0 ) FetchContent_MakeAvailable(SDL3) endif() if(NOT TARGET imgui::imgui) FetchContent_Declare( imgui GIT_REPOSITORY https://github.com/ocornut/imgui.git GIT_TAG v1.90.4 ) FetchContent_MakeAvailable(imgui) add_library(imgui_backends STATIC ${imgui_SOURCE_DIR}/backends/imgui_impl_sdl3.cpp ${imgui_SOURCE_DIR}/backends/imgui_impl_sdlrenderer3.cpp ) target_include_directories(imgui_backends PUBLIC ${imgui_SOURCE_DIR} ${imgui_SOURCE_DIR}/backends ${SDL3_INCLUDE_DIRS} ) target_link_libraries(imgui_backends PUBLIC imgui::imgui SDL3::SDL3 SDL3::SDL3_renderer ) endif()
2. (可选)把依赖安装到引擎目录
如果你希望用户不用拉取源码,直接用你打包好的依赖,可以在CMakeLists.txt末尾添加安装SDL3和ImGui的逻辑:
# 安装SDL3的库和头文件 install(TARGETS SDL3 SDL3_renderer ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) install(DIRECTORY ${SDL3_SOURCE_DIR}/include/SDL3 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) # 安装ImGui的库和头文件 install(TARGETS imgui_core imgui_backends ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) install(DIRECTORY ${imgui_SOURCE_DIR}/ ${imgui_SOURCE_DIR}/backends/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/imgui FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp" )
第四步:用户项目的使用验证
现在用户的项目只需要简单的配置就能用你的引擎了,示例CMakeLists.txt:
cmake_minimum_required(VERSION 3.30) project(MyGame) # 查找你的引擎 find_package(MyEngine REQUIRED) # 构建游戏可执行文件 add_executable(MyGame game.cpp) # 直接链接引擎的子库即可,依赖会自动传递 target_link_libraries(MyGame PRIVATE MyEngine::Engine MyEngine::Player MyEngine::World)
一些实用注意点
- 版本稳定性:FetchContent里的
GIT_TAG尽量用稳定版本标签,别用main分支,避免构建不稳定。 - 库类型选择:如果你的引擎是动态库,SDL3和ImGui可以选动态链接;如果是静态库,依赖会被编译进用户的可执行文件里。
- 版本管理:你设置的
CMAKE_INSTALL_PREFIX会生成带版本号的安装目录,方便多版本引擎共存。
内容来源于stack exchange
相关产品推荐
相关产品推荐

