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

如何在CMake配置阶段获取目标二进制文件的完整文件名

解决CMake配置阶段获取完整二进制文件名的方案

要在配置阶段拿到二进制文件的完整名称(含前缀、后缀),可以通过组合目标属性与CMake的全局变量来实现,以下是两种可靠的方式:

方法一:基于全局前缀/后缀拼接(常规场景)

CMake提供了全局变量CMAKE_EXECUTABLE_PREFIX和CMAKE_EXECUTABLE_SUFFIX,对应平台默认的可执行文件前缀(如Linux、Windows下默认为空)和后缀(Windows下为.exe,Linux下为空)。结合目标的OUTPUT_NAME属性,就能拼接出完整文件名:

# 获取目标的输出名称,若未设置则使用目标本身的名称
get_target_property(BINARY_OUTPUT_NAME my_binary OUTPUT_NAME)
if(NOT BINARY_OUTPUT_NAME)
  set(BINARY_OUTPUT_NAME my_binary)
endif()

# 拼接完整的二进制文件名
set(FULL_BINARY_NAME "${CMAKE_EXECUTABLE_PREFIX}${BINARY_OUTPUT_NAME}${CMAKE_EXECUTABLE_SUFFIX}")

# 将变量传入模板脚本
configure_file(run_script.in run_script @ONLY)

在你的run_script.in模板中,直接用@FULL_BINARY_NAME@引用即可。

方法二:基于目标自定义前缀/后缀拼接(精准场景)

如果你的目标通过set_target_properties单独设置了PREFIX或SUFFIX属性(覆盖了全局变量),需要优先获取目标自身的这些属性:

# 获取目标输出名称
get_target_property(BINARY_OUTPUT_NAME my_binary OUTPUT_NAME)
if(NOT BINARY_OUTPUT_NAME)
  set(BINARY_OUTPUT_NAME my_binary)
endif()

# 获取目标自定义前缀,未设置则用全局前缀
get_target_property(BINARY_PREFIX my_binary PREFIX)
if(NOT BINARY_PREFIX)
  set(BINARY_PREFIX "${CMAKE_EXECUTABLE_PREFIX}")
endif()

# 获取目标自定义后缀,未设置则用全局后缀
get_target_property(BINARY_SUFFIX my_binary SUFFIX)
if(NOT BINARY_SUFFIX)
  set(BINARY_SUFFIX "${CMAKE_EXECUTABLE_SUFFIX}")
endif()

# 拼接完整文件名
set(FULL_BINARY_NAME "${BINARY_PREFIX}${BINARY_OUTPUT_NAME}${BINARY_SUFFIX}")

# 生成运行脚本
configure_file(run_script.in run_script @ONLY)

注意事项

  • 这两种方法仅适用于常规的可执行目标配置,如果你的二进制文件名是通过自定义构建命令动态生成的,配置阶段可能无法准确获取(这类场景建议改用构建阶段生成脚本的方式,比如用add_custom_command)。
  • 变量拼接完成后,直接在configure_file中使用@VAR_NAME@的方式引用即可,因为configure_file在配置阶段会替换这些变量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:01:21