You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 10:23:03