如何通过CMake指定SDL.dll的编译输出目录?
问题
项目external/CMakeLists.txt内容:
add_subdirectory(spdlog EXCLUDE_FROM_ALL) add_subdirectory(SDL EXCLUDE_FROM_ALL)
根目录CMakeLists.txt配置如下:
cmake_minimum_required(VERSION 3.12) set(PROJECT_NAME "JuicyEngine") add_subdirectory(external) project(${PROJECT_NAME}) set(CMAKE_CXX_STANDARD 17) set(INCLUDE_DIRS "$ENV{VULKAN_SDK}/Include" ) set(LINKER_FLAGS "-user32" "-lvulkan-1" "-L$ENV{VULKAN_SDK}/Lib" ) add_compile_definitions(D_DEBUG JE_EXPORT) set(SRC_FILES src/test.cpp src/core/log.cpp) set(INCLUDE_FILES src/defines.h src/test.h src/core/log.h ) source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SRC_FILES} ${INCLUDE_FILES} ) add_library(${PROJECT_NAME} SHARED ${SRC_FILES} ${INCLUDE_FILES}) target_include_directories(${PROJECT_NAME} PUBLIC ${INCLUDE_DIRS} ${HEADERS}) target_link_libraries(${PROJECT_NAME} PRIVATE spdlog) target_link_libraries(${PROJECT_NAME} PRIVATE SDL3::SDL3) set_target_properties(${PROJECT_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/$<CONFIG> ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/$<CONFIG> RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/$<CONFIG> )
编译后SDL.dll位于engine\build\external\SDL\Debug,需通过CMake配置指定该动态库的输出目录。
解决方案
提供三种可行配置方式,可根据需求选择:
方式1:全局统一输出目录(影响所有子项目)
在根目录CMakeLists.txt的add_subdirectory(external)语句之前,添加全局输出目录设置,让所有外部项目(包括SDL)继承该路径:
# 全局设置所有目标的输出目录 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/$<CONFIG>) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/$<CONFIG>) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/$<CONFIG>) add_subdirectory(external)
$<CONFIG>会自动适配Debug/Release等配置,保证不同配置的文件分开存放。
方式2:单独指定SDL目标的输出目录
若不想影响spdlog等其他外部项目,可在根目录CMakeLists.txt中,add_subdirectory(external)之后,单独修改SDL目标的属性:
add_subdirectory(external) # 修改SDL动态库的输出目录 set_target_properties(SDL3::SDL3 PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/$<CONFIG> LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/$<CONFIG> ) # 若存在SDL3main静态库,同步调整其输出目录 if(TARGET SDL3::SDL3main) set_target_properties(SDL3::SDL3main PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/$<CONFIG> ) endif()
该方式仅对SDL相关目标生效,不干扰其他项目。
方式3:在external目录的CMakeLists中局部设置
修改external/CMakeLists.txt,在添加SDL子目录前临时设置输出目录:
add_subdirectory(spdlog EXCLUDE_FROM_ALL) # 临时设置输出目录,仅影响后续的SDL项目 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/$<CONFIG>) add_subdirectory(SDL EXCLUDE_FROM_ALL) # 可选:恢复全局默认设置(若其他外部项目需使用原路径) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "")
这种方式将配置限制在external目录内部,避免污染根目录的全局设置。
注意事项
- 可根据主项目的输出路径,将
${CMAKE_SOURCE_DIR}/bin/$<CONFIG>替换为${CMAKE_BINARY_DIR}/bin/$<CONFIG>,保持路径一致性。 - 对于Visual Studio等多配置生成器,
$<CONFIG>会自动替换为当前编译配置名称,无需手动区分Debug/Release。
内容的提问来源于stack exchange,提问作者DirtyCode
相关产品推荐
相关产品推荐

