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

如何让CMake‘遗忘’指定目标some_target?

让CMake“遗忘”已定义目标的两种方法

方法一:利用CMake策略CMP0045(通用方案)

CMake 3.0及以上默认启用CMP0045 NEW策略,此时if(TARGET <name>)会优先检查是否存在同名目标。切换到OLD策略后,该判断会先检查是否存在同名变量,以变量值作为判断结果。

在包含那个会检查some_target的依赖之前,添加以下代码:

# 切换策略,让if(TARGET)优先检查变量
cmake_policy(SET CMP0045 OLD)
# 定义同名变量,值为FALSE,让判断不成立
set(some_target FALSE)

注意:该方法会改变if(TARGET)的全局判断逻辑,若项目其他地方有类似判断可能受影响。建议在包含目标依赖的代码块前后临时切换策略,用完后恢复:

# 临时切换策略
cmake_policy(PUSH)
cmake_policy(SET CMP0045 OLD)
set(some_target FALSE)

# 包含需要屏蔽判断的依赖
include(that_dependency_you_cannot_control)

# 恢复原策略
cmake_policy(POP)

方法二:针对导入目标的直接处理

如果some_target是通过find_package等方式导入的外部目标,可以直接清除其导入属性,让CMake不再识别它为有效目标:

if(TARGET some_target)
  get_target_property(_is_imported some_target IMPORTED)
  if(_is_imported)
    # 清除导入标记
    set_target_properties(some_target PROPERTIES IMPORTED FALSE)
    # 从当前上下文移除目标引用
    unset(some_target)
  endif()
endif()

注意:该方法仅对导入目标有效,对项目内定义的本地目标无效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 21:54:52