使用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
相关产品推荐
相关产品推荐

