CMake安装时执行Debug或Release版本目标的路径匹配问题
解决方案
首先明确问题根因:INSTALL(SCRIPT) 调用的脚本默认不会自动解析CMake生成器表达式,生成器表达式仅在构建/安装阶段的特定上下文(如INSTALL(CODE)、目标属性配置)中才会展开,因此你无法直接在自定义安装脚本中使用生成器表达式获取不同配置下的可执行文件路径。
方案1:通过INSTALL(CODE)传参调用脚本(更推荐,跨平台兼容)
直接使用$<TARGET_FILE:MyProgram>生成器表达式获取对应配置下的可执行文件绝对路径,无需手动拼接路径,不受输出目录配置改动影响:
# 替换你原来的 INSTALL(SCRIPT MyScript.cmake) 配置 install(CODE " execute_process( COMMAND ${CMAKE_COMMAND} # 将目标文件路径作为参数传入脚本 -DMY_PROGRAM_EXECUTABLE=$<TARGET_FILE:MyProgram> # 指定要执行的脚本路径 -P ${CMAKE_CURRENT_SOURCE_DIR}/MyScript.cmake RESULT_VARIABLE RUN_RESULT ) if(NOT RUN_RESULT EQUAL 0) message(FATAL_ERROR \"执行MyProgram失败,安装中止\") endif() ")
之后在MyScript.cmake中直接使用传入的MY_PROGRAM_EXECUTABLE变量即可:
# MyScript.cmake 示例代码 execute_process( COMMAND ${MY_PROGRAM_EXECUTABLE} 你要传入的参数 COMMAND_ERROR_IS_FATAL ANY )
方案2:在脚本中使用内置配置变量
如果要保留INSTALL(SCRIPT)的写法,可在脚本中直接读取多配置生成器内置的CMAKE_INSTALL_CONFIG_NAME变量拼接路径:
# MyScript.cmake 示例代码 # 兼容单配置生成器(如Makefile) if(NOT CMAKE_INSTALL_CONFIG_NAME) set(CMAKE_INSTALL_CONFIG_NAME ${CMAKE_BUILD_TYPE}) endif() # 拼接可执行文件路径 set(MY_PROGRAM_EXECUTABLE "${EXECUTABLE_OUTPUT_PATH}/${CMAKE_INSTALL_CONFIG_NAME}/MyProgram.exe") # 执行程序 execute_process( COMMAND ${MY_PROGRAM_EXECUTABLE} 你要传入的参数 COMMAND_ERROR_IS_FATAL ANY )
注意:方案2依赖
EXECUTABLE_OUTPUT_PATH的配置没有被目标级别的RUNTIME_OUTPUT_DIRECTORY属性覆盖,否则拼接的路径会失效,优先推荐使用方案1。
内容的提问来源于stack exchange,提问作者ConanLord
相关产品推荐
相关产品推荐

