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

add_custom_target属性疑问:如何获取自定义目标的依赖列表?

解决CMake自定义目标属性获取问题

嘿,这个问题我之前折腾CMake的时候也碰到过,自定义目标的属性处理确实有几个需要注意的点,咱们一步步来拆解解决:

一、先搞清楚自定义目标支持哪些属性

CMake里用add_custom_target创建的目标属于UTILITY类型,它支持不少通用属性,常用的包括:

  • COMMAND:你指定的执行命令
  • DEPENDS:目标依赖的文件或其他目标列表
  • WORKING_DIRECTORY:命令执行的工作目录
  • COMMENT:构建时显示的注释信息
  • TYPE:固定为UTILITY(区别于EXECUTABLE、LIBRARY这类目标)
  • NAME:目标的名称

如果想查看某个自定义目标的所有已设置属性,可以在CMakeLists里加这段代码:

get_target_property(ALL_PROPS exsdk PROPERTIES)
message("所有属性列表: ${ALL_PROPS}")

二、为什么get_target_property提示找不到目标?

你遇到的exsdk未找到问题,大概率是这两个原因:

  1. 时机不对:CMake是按顺序执行脚本的,必须在add_custom_target(exsdk ...)之后调用get_target_property,如果在定义目标之前就去获取属性,肯定会报错。
  2. 作用域/拼写问题:检查目标名称有没有拼写错误,或者如果目标是在子目录的CMakeLists里定义的,要确保父目录已经通过add_subdirectory引入了子目录,否则父目录无法访问子目录里的目标。

三、正确获取自定义目标的DEPENDS属性

解决上面的问题后,你可以用两种方式获取依赖列表:

方式1:用get_target_property(最直接)

确保在目标定义之后调用,写法如下:

# 先定义自定义目标
add_custom_target(exsdk COMMAND echo DEPENDS foo.jar bar.jar)

# 然后获取DEPENDS属性
get_target_property(EXSDK_DEPS exsdk DEPENDS)

# 打印验证(可选)
if(EXSDK_DEPS)
  message("exsdk的依赖项: ${EXSDK_DEPS}")
endif()

方式2:用get_property指定TARGETS作用域

如果第一种方式还是有问题,可以试试这种更明确的写法:

get_property(EXSDK_DEPS TARGET exsdk PROPERTY DEPENDS)
message("exsdk的依赖项: ${EXSDK_DEPS}")

两种方式都能正确拿到foo.jar和bar.jar这个依赖列表,你可以根据自己的脚本结构选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 15:42:27