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

如何获取CMake中指定目标的所有别名目标?

获取CMake原目标的所有别名目标列表

CMake原生并没有提供直接反向查询原目标对应所有别名的内置命令——因为别名的ALIASED_TARGET属性仅存储在别名目标本身,原目标不会主动记录指向它的别名。不过可以通过两种方式实现需求:

1. 自定义属性手动记录别名(推荐,可控性强)

在创建别名时,手动将别名添加到原目标的自定义属性中,后续直接读取该属性即可获取所有别名。

示例代码:

# 创建原目标
add_executable(my_exe main.cpp)

# 创建别名并同步记录到原目标属性
add_executable(my_exe_alias ALIAS my_exe)
set_property(TARGET my_exe APPEND PROPERTY ALIASES my_exe_alias)

add_executable(my_exe_alias2 ALIAS my_exe)
set_property(TARGET my_exe APPEND PROPERTY ALIASES my_exe_alias2)

# 读取原目标的所有别名
get_target_property(my_exe_aliases my_exe ALIASES)
if(my_exe_aliases)
  message("Aliases for my_exe: ${my_exe_aliases}")
endif()

2. 遍历所有目标反向匹配别名

如果无法修改别名创建的代码(比如处理第三方项目),可以遍历所有已定义的目标,逐个检查其ALIASED_TARGET属性是否等于目标,收集匹配的别名。

示例函数:

function(get_target_all_aliases target out_var)
  set(result "")
  # 获取所有构建系统目标
  get_cmake_property(all_targets BUILDSYSTEM_TARGETS)
  foreach(t IN LISTS all_targets)
    get_target_property(aliased_target ${t} ALIASED_TARGET)
    # 检查当前目标是否是指定目标的别名
    if(aliased_target STREQUAL "${target}")
      list(APPEND result ${t})
    endif()
  endforeach()
  set(${out_var} ${result} PARENT_SCOPE)
endfunction()

# 使用示例
get_target_all_aliases(my_exe my_exe_aliases)
message("Aliases for my_exe: ${my_exe_aliases}")

注意:这种遍历方式会包含所有类型的目标(包括导入目标),如果项目中目标数量极多,可能会有轻微的性能损耗,但在绝大多数场景下可以忽略。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 04:06:25