CMake全局设置运行输出目录后,特殊目标自定义路径不生效如何解决?
解决CMake特殊目标输出目录不生效的问题
这个问题的核心在于全局的CMAKE_RUNTIME_OUTPUT_DIRECTORY设置会覆盖目标级别的配置,尤其是在多构建配置环境(比如Visual Studio、Xcode)下,配置特定的属性优先级更高。下面给出两种针对性的解决方案:
方法一:调整全局设置的顺序(推荐单配置生成器,如Makefile、Ninja)
把特殊目标的创建和属性设置放在全局输出目录设置之前。因为CMake的全局变量CMAKE_RUNTIME_OUTPUT_DIRECTORY只会对之后添加的目标生效,已经创建的目标不会被这个全局设置覆盖。修改后的代码如下:
cmake_minimum_required(VERSION 2.8.0) project(mcve) # 先处理特殊目标,单独设置它的输出目录 add_executable(special_target special.cpp) set_target_properties(special_target PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/someotherpath ) # 再设置全局输出目录,仅对后续添加的普通目标生效 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) # 后续添加的普通目标会自动输出到bin目录 # add_executable(regular_target regular.cpp)
方法二:设置配置特定的目标属性(适配多配置生成器)
如果你使用的是Visual Studio、Xcode这类多配置生成器,全局的CMAKE_RUNTIME_OUTPUT_DIRECTORY会自动为每个配置(Debug/Release等)生成对应的目标属性(比如RUNTIME_OUTPUT_DIRECTORY_DEBUG),这时候通用的RUNTIME_OUTPUT_DIRECTORY属性优先级更低,不会生效。你需要为每个配置单独设置输出目录:
cmake_minimum_required(VERSION 2.8.0) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) project(mcve) add_executable(special_target special.cpp) # 为每个配置设置特殊目标的输出目录 set_target_properties(special_target PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/someotherpath/debug RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/someotherpath/release RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_BINARY_DIR}/someotherpath/relwithdebinfo RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL ${CMAKE_BINARY_DIR}/someotherpath/minsizerel )
如果希望所有配置都输出到同一个目录,可以用循环简化代码:
cmake_minimum_required(VERSION 2.8.0) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) project(mcve) add_executable(special_target special.cpp) # 遍历常见配置,统一设置输出目录 foreach(config DEBUG RELEASE RELWITHDEBINFO MINSIZEREL) set_target_properties(special_target PROPERTIES RUNTIME_OUTPUT_DIRECTORY_${config} ${CMAKE_BINARY_DIR}/someotherpath ) endforeach()
验证设置是否生效
你可以在CMakeLists.txt中添加调试输出,确认目标的实际输出目录:
# 查看通用输出目录 get_target_property(out_dir special_target RUNTIME_OUTPUT_DIRECTORY) message(STATUS "Special target output directory: ${out_dir}") # 针对多配置生成器,查看Debug配置的输出目录 get_target_property(out_dir_debug special_target RUNTIME_OUTPUT_DIRECTORY_DEBUG) message(STATUS "Special target Debug output directory: ${out_dir_debug}")
内容的提问来源于stack exchange,提问作者matrix_space
相关产品推荐
相关产品推荐

