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

使用Git子模块编译SDL3时,自动复制SDL3.dll至build/src的方案

自动复制SDL3.dll到编译输出目录的解决方案

问题场景

使用SDL3开发时,每次启动生成的.exe文件前,都需要手动将SDL3.dll复制到build/src目录。由于采用Git子模块引入SDL3,该.dll文件是编译生成而非预编译状态,无法直接用file(<COPY|INSTALL>)命令完成自动复制。

当前文件夹结构:

  • build
  • include
  • src
  • submodules

submodules/CMakeLists.txt内容:

add_subdirectory(SDL)
add_subdirectory(glm)

add_library(submodules INTERFACE)
target_link_libraries(submodules INTERFACE SDL3::SDL3 glm)

src/CMakeLists.txt内容:

add_executable(${PROJECT_NAME})
add_library(game SHARED game.cpp)
target_include_directories(game PRIVATE ${PROJECT_SOURCE_DIR}/include)
target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/include)
target_sources(${PROJECT_NAME} PRIVATE main.cpp
engine.cpp
glad.c
graphics.cpp
action_manager.cpp)
target_link_libraries(${PROJECT_NAME} PRIVATE submodules game)

解决步骤

1. 确保SDL3编译为动态库

如果SDL3默认被编译为静态库,不会生成.dll文件。可以在submodules/CMakeLists.txt中添加配置,强制编译动态库:

# 强制SDL3编译为动态库
set(SDL_SHARED ON CACHE BOOL "Build SDL as a shared library")
add_subdirectory(SDL)
add_subdirectory(glm)

add_library(submodules INTERFACE)
target_link_libraries(submodules INTERFACE SDL3::SDL3 glm)

2. 添加自动复制命令到src/CMakeLists.txt

在src/CMakeLists.txt中,针对你的可执行目标${PROJECT_NAME},添加POST_BUILD阶段的自定义复制命令:

add_executable(${PROJECT_NAME})
add_library(game SHARED game.cpp)
target_include_directories(game PRIVATE ${PROJECT_SOURCE_DIR}/include)
target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/include)
target_sources(${PROJECT_NAME} PRIVATE main.cpp
engine.cpp
glad.c
graphics.cpp
action_manager.cpp)
target_link_libraries(${PROJECT_NAME} PRIVATE submodules game)

# 自动复制SDL3.dll到可执行文件所在目录
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        $<TARGET_FILE:SDL3::SDL3>
        $<TARGET_FILE_DIR:${PROJECT_NAME}>
    COMMENT "Copying SDL3.dll to output directory..."
)

命令说明

  • POST_BUILD:指定在可执行文件编译完成后执行该命令
  • copy_if_different:仅当源文件(SDL3.dll)与目标文件存在差异时才复制,避免重复操作
  • $<TARGET_FILE:SDL3::SDL3>:CMake生成器表达式,自动获取SDL3动态库的完整路径(包含.dll文件名)
  • $<TARGET_FILE_DIR:${PROJECT_NAME}>:自动获取你的可执行文件所在的输出目录(即build/src)

这样配置后,每次编译完成,SDL3.dll都会自动复制到你的.exe所在目录,无需手动操作。

内容的提问来源于stack exchange,提问作者koogel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 10:40:10