CMake中find_package_handle_standard_args版本不符时如何不强制报错
问题解决方法
你遇到的问题分为两个独立部分,分别处理即可:
1. 先修复语法报错
你贴出的报错是CMake 3.18版本FindPackageHandleStandardArgs模块的已知bug:Windows路径中的反斜杠\没有做转义处理,直接拼接进错误消息时会被CMake识别为非法转义字符,触发语法错误。
修复方案二选一即可:
- 升级CMake到3.19及以上版本,官方已修复该路径转义问题
- 如果必须兼容3.18版本,在调用
find_package_handle_standard_args前,将所有路径变量的反斜杠替换为正斜杠:
file(TO_CMAKE_PATH "${XXX_ROOT_DIR}" XXX_ROOT_DIR)
2. 实现版本不匹配仅标记查找失败、不中断配置的需求
find_package_handle_standard_args原生就支持你要的逻辑:只要调用find_package时没有加REQUIRED参数,即便版本不匹配,也只会将XXX_FOUND设置为FALSE,不会抛出硬性错误中断配置流程,你当前的报错完全是上述版本bug导致的,和该函数的默认行为无关。
你不需要手动取消XXX_ROOT_DIR的定义,也不需要重复执行查找逻辑,修复路径转义问题后即可符合预期:
- 不加
REQUIRED调用find_package(XXX 4.5)时,版本不匹配仅输出提示消息,XXX_FOUND自动设为OFF,配置流程继续 - 仅当调用
find_package(XXX 4.5 REQUIRED)时,版本不匹配才会抛出错误中断配置
内容的提问来源于stack exchange,提问作者Holt
相关产品推荐
相关产品推荐

