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

如何获取CMake中指定目标的所有已设置属性名称

CMake获取指定目标全部已设置属性名称的方案

我们在使用CMake时,经常需要获取某个目标上所有已设置的属性,包括CMake预定义属性和自定义的额外属性。以下是两种不同场景下的实现方案:

方案1:CMake 3.19及以上版本(推荐)

从3.19版本开始,CMake原生支持直接查询目标的所有已设置属性名,不需要额外处理自定义属性,直接就能拿到完整列表,实现你需要的get_target_property_names函数的代码如下:

function(get_target_property_names target output_list)
    cmake_language(GET_PROPERTY all_props TARGET ${target} PROPERTY_NAMES)
    set(${output_list} ${all_props} PARENT_SCOPE)
endfunction()

使用方式和预期完全一致:

# 调用函数获取所有属性名
get_target_property_names(some_target property_names)
# 可以打印验证结果
message("目标some_target的所有属性:${property_names}")

这个方案会自动包含你通过set_target_properties设置的自定义属性,比如示例中的some_custom_property会正常出现在返回的列表里。

方案2:兼容CMake 3.19以下的旧版本

如果你使用的CMake版本低于3.19,没有原生的属性名查询接口,只能通过预定义属性遍历+自定义属性补录的方式实现,代码如下:

function(get_target_property_names target output_list)
    # 1. 获取CMake所有预定义属性列表
    execute_process(
        COMMAND ${CMAKE_COMMAND} --help-property-list
        OUTPUT_VARIABLE predefined_prop_list
        OUTPUT_STRIP_TRAILING_WHITESPACE
    )
    string(REPLACE "\n" ";" predefined_prop_list "${predefined_prop_list}")

    # 2. 补充你自己用到的所有自定义属性名,根据实际情况修改
    set(custom_prop_list some_custom_property other_custom_prop)
    list(APPEND check_prop_list ${predefined_prop_list} ${custom_prop_list})

    # 3. 遍历校验属性是否在目标上存在
    set(exist_props "")
    foreach(prop ${check_prop_list})
        get_target_property(prop_value ${target} ${prop})
        if(NOT prop_value STREQUAL "prop_value-NOTFOUND")
            list(APPEND exist_props ${prop})
        endif()
    endforeach()

    set(${output_list} ${exist_props} PARENT_SCOPE)
endfunction()

注意该方案的限制:未提前加入custom_prop_list的自定义属性无法被识别,这是旧版本CMake的接口限制,没有其他绕过方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 04:15:07