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

如何移除/删除CMake目标?解决第三方脚本导致uninstall目标重复创建的报错问题

解决CMake中重复创建"uninstall"目标的问题

这种第三方脚本乱创建重复目标的情况确实头疼,毕竟咱们没法直接改人家的代码。不过好在CMake有一些办法能处理这个问题,给你几个可行的方案:

方案1:用官方命令移除(CMake 3.18及以上版本)

从CMake 3.18开始,官方提供了remove_custom_target命令,专门用来删除自定义目标,这是最稳妥的方法。你只需要在调用第三方脚本的前后,先检查目标是否存在,存在就删掉:

# 先检查uninstall目标是否已经存在
if(TARGET uninstall)
    # 移除已存在的uninstall自定义目标
    remove_custom_target(uninstall)
endif()

# 在这里执行你的第三方脚本,比如include或者ExternalProject_Add之类的操作
# include(third-party-script.cmake)

如果是两个第三方脚本都创建了uninstall,你可以在第一个脚本运行完之后执行一次移除,再运行第二个脚本;或者等两个都运行完之后统一移除,再根据自己的需求重新创建(如果需要的话)。

方案2:兼容旧版本CMake的hack方法(3.18以下)

如果你的CMake版本还停留在3.18之前,没有remove_custom_target命令,那可以用点“野路子”,直接修改CMake内部维护的目标列表:

if(TARGET uninstall)
    # 获取当前目录下的所有构建目标
    get_directory_property(all_targets BUILDSYSTEM_TARGETS)
    # 从列表里把uninstall去掉
    list(REMOVE_ITEM all_targets uninstall)
    # 更新目录的目标列表
    set_directory_properties(PROPERTIES BUILDSYSTEM_TARGETS "${all_targets}")
    # 顺便清理相关的缓存变量
    unset(uninstall CACHE)
endif()

这个方法虽然有点hack,但在旧版本CMake里确实能生效,不过要注意不同CMake版本可能有细微差异,测试一下再用。

方案3:尝试让第三方脚本跳过创建uninstall

有些第三方CMake脚本会提供开关变量,用来控制是否生成uninstall目标。比如有些脚本会检查NO_UNINSTALL或者SKIP_UNINSTALL这类变量,如果存在就不创建uninstall。你可以在调用第三方脚本前试试设置这类变量:

# 尝试告诉第三方脚本不要创建uninstall目标
set(NO_UNINSTALL ON)
# 然后调用第三方脚本
include(third-party-script.cmake)

不过这个要看第三方脚本是否支持,毕竟咱们没法控制人家的代码,只能碰运气,但万一有用呢?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 20:12:32