如何使用配置模式和模块模式的后备进行find_package搜索?

时间:2018-06-21 23:27:48

标签: c++ cmake

当库使用CMake定义构建并遇到为其自身构建安装软件包的麻烦时,就会出现XXXConfig.cmake

如果库无法将其目标导出到CMake,则CMake会尝试通过提供FindXXX.cmake脚本来查找此类库来缩小差距。

在文档中,首先尝试FindXXX.cmake(模块模式),只有失败后,它才尝试使用XXXConfig.cmake(配置模式)。但这对我来说似乎真的很倒退。

问题是,例如,我从源代码构建了CURL,并且ConfigXXX产生了与FindXXX不同的目标名称,因此,在尝试使用它时,它会失败,因为FindXXX负责find_package请求并加载了另一个目标名称超出了我的预期。

我至少可以告诉CMake反过来做事吗?首先配置模式。

我知道我可以完全禁用模块模式,但我希望将其作为后备选项。

3 个答案:

答案 0 :(得分:3)

只需在{em> CONFIG 模式下使用find_package,检查其结果,如果结果为假,则以 MODULE 模式重复调用:

# First time do not use common *REQUIRED* but use QUIET for do not output error messages on fail.
find_package(XXX CONFIG QUIET)
if(NOT XXX_FOUND)
    # Previous call has been failed. Fallback with MODULE mode.
    find_package(XXX MODULE REQUIRED) # Now it is OK to use REQUIRED if needed.
    # ... There could be additional actions for wrap result "as if" CONFIG mode.
endif()
# ... use XXX

答案 1 :(得分:2)

您可以尝试此find_package(XXX CONFIG REQUIRED)

查看链接:mysqli_fetch_assoc

答案 2 :(得分:-1)

3.15版中的新功能

  

CMAKE_FIND_PACKAGE_PREFER_CONFIG设置为TRUE,以告知find_package()首先使用Config模式进行搜索,然后再回到Module模式。

参考:12