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

如何通过CMake将所有输出(含中间文件)放入Release子文件夹?

问题描述

我在Windows平台使用的CMakeLists.txt内容如下:

cmake_minimum_required(VERSION 3.5)

project(LogMsg)

# Set the project source files
set(SOURCES
    LogMsg.cpp
    LogMsgMain.rc
    LogMsg.h
    resource.h
    stdafx.h
)

# Add executable target
add_library(LogMsg SHARED ${SOURCES})

# Set the configuration-specific outputs
set_target_properties(LogMsg PROPERTIES
    RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/Debug"
    RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/Release"
)

# Add include directories
target_include_directories(LogMsg PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})

# Specify custom build commands
add_custom_command(TARGET LogMsg POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/LogMsg.rc" "$<TARGET_FILE_DIR:LogMsg>"
    COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/LogMsg.h" "$<TARGET_FILE_DIR:LogMsg>"
)

执行的命令:

cmake -G "Visual Studio 17 2022" -S . -B .
cmake --build . --config Release

目前Release子文件夹中生成了.dll文件、.rc文件和.h文件,但LogMsg.tlog目录以及LogMsg.dll.recipe、LogMsg.obj、LogMsgMain.res等中间文件生成在LogMsg.dir/Release路径下,希望将这些文件也直接放入Release文件夹,请问该如何配置?


解决方案

只需在set_target_properties中添加配置特定的中间文件输出目录属性,就能把.obj、.res、.recipe及tlog目录等中间文件直接生成到Debug/Release文件夹中。

修改后的CMakeLists.txt如下:

cmake_minimum_required(VERSION 3.5)

project(LogMsg)

# Set the project source files
set(SOURCES
    LogMsg.cpp
    LogMsgMain.rc
    LogMsg.h
    resource.h
    stdafx.h
)

# Add executable target
add_library(LogMsg SHARED ${SOURCES})

# Set configuration-specific output directories for runtime and intermediate files
set_target_properties(LogMsg PROPERTIES
    # 指定运行时文件(如dll)的输出目录
    RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/Debug"
    RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/Release"
    # 指定中间编译文件的输出目录
    INTERMEDIATE_DIRECTORY_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/Debug"
    INTERMEDIATE_DIRECTORY_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/Release"
)

# Add include directories
target_include_directories(LogMsg PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})

# Specify custom build commands
add_custom_command(TARGET LogMsg POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/LogMsg.rc" "$<TARGET_FILE_DIR:LogMsg>"
    COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/LogMsg.h" "$<TARGET_FILE_DIR:LogMsg>"
)

如果想简化配置,也可以用生成器表达式统一处理Debug和Release两种配置:

set_target_properties(LogMsg PROPERTIES
    RUNTIME_OUTPUT_DIRECTORY "$<IF:$<CONFIG:Debug>,${CMAKE_CURRENT_SOURCE_DIR}/Debug,${CMAKE_CURRENT_SOURCE_DIR}/Release>"
    INTERMEDIATE_DIRECTORY "$<IF:$<CONFIG:Debug>,${CMAKE_CURRENT_SOURCE_DIR}/Debug,${CMAKE_CURRENT_SOURCE_DIR}/Release>"
)

补充说明

  • INTERMEDIATE_DIRECTORY_<CONFIG>是Visual Studio生成器特有的属性,专门控制中间编译文件的存放路径。
  • 如果Debug/Release目录不存在,CMake会自动创建。
  • 若需要同步控制PDB调试文件的输出位置,可额外添加PDB_OUTPUT_DIRECTORY_DEBUG和PDB_OUTPUT_DIRECTORY_RELEASE属性,指向相同的目标目录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 17:24:58