如何让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
相关产品推荐
相关产品推荐

