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

如何在CMake中判断指定目标是否为别名目标?

解决CMake别名目标的检测问题

首先,CMake没有内置的ALIASES_TARGET判断指令,要识别别名目标,得通过获取目标的ALIASED_TARGET属性来实现。另外先处理你提到的含分号的无效目标,直接跳过即可。

修改后的函数代码如下:

function(my_fancy_function targetName dstDir)
  # 忽略含分号的无效命名目标
  if("${targetName}" MATCHES ";")
    return()
  endif()

  if(TARGET ${targetName})
    # 获取目标的ALIASED_TARGET属性,判断是否为别名目标
    get_target_property(aliased_target ${targetName} ALIASED_TARGET)
    if(NOT aliased_target STREQUAL "aliased_target-NOTFOUND")
      message(STATUS "this is an aliases target, points to: ${aliased_target}")
      # 别名目标本身没有库类型,需要获取它指向的实际目标的类型
      set(actual_target ${aliased_target})
    else()
      message(STATUS "this is an ordinary target")
      set(actual_target ${targetName})
    endif()

    # 检测实际目标的库类型,如果是共享库则复制到指定目录
    get_target_property(target_type ${actual_target} TYPE)
    if(target_type STREQUAL "SHARED_LIBRARY")
      message(STATUS "Copying shared library ${actual_target} to ${dstDir}")
      # 这里添加复制逻辑,比如用add_custom_command等
      add_custom_command(TARGET ${actual_target} POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${actual_target}> ${dstDir}
      )
    endif()
  endif()
endfunction()

关键说明:

  • 过滤无效目标:通过MATCHES ";"判断目标名称是否包含分号,直接返回跳过处理。
  • 判断别名目标:使用get_target_property获取ALIASED_TARGET属性,如果该属性不是NOTFOUND,说明当前目标是别名,它指向的真实目标就是aliased_target的值。
  • 获取实际库类型:别名目标本身没有类型信息,必须拿到它指向的真实目标,再通过TYPE属性判断是静态库(STATIC_LIBRARY)还是共享库(SHARED_LIBRARY)。
  • 复制共享库:确认是共享库后,用add_custom_command配合POST_BUILD事件实现复制操作,$<TARGET_FILE:${actual_target}>是CMake生成器表达式,会自动替换为目标文件的完整路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 19:22:20