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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:52:41