如何通过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
相关产品推荐
相关产品推荐

