使用自定义目录提示 Find<name>.cmake 文件

Posted

技术标签:

【中文标题】使用自定义目录提示 Find<name>.cmake 文件【英文标题】:Hinting Find<name>.cmake Files with a custom directory 【发布时间】:2016-01-14 17:22:33 【问题描述】:

在 CMake 中,有没有办法制作内置的 Find 脚本来优先考虑我们指定的自定义目录?因为特别是在 Windows 中,模块查找脚本通常无法检测到模块,例如 Visual Studio 目录。因此,我通常不得不手动设置外部库的路径,这很累人。相反,我希望这些脚本查看自定义目录,让我们先说主项目中的“依赖项”文件夹,这样我就可以直接将这些外部文件放入该文件夹中,这比将它们放入 VC 文件夹或手动设置要容易得多路径。

【问题讨论】:

【参考方案1】:

设置CMAKE_PREFIX_PATH 变量正是为了这些目的:提示find_* 函数关于搜索项目的位置。

虽然此变量的描述并未提及 find_package 函数,但该变量会影响它间接:大多数 Find&lt;name&gt;.cmake 脚本使用 find_library 和 find_path 函数。请注意,所有find_* 函数都有精确算法 用于搜索项,并且使用CMAKE_PREFIX_PATH 构造的路径在系统路径之前检查。

此外,CMAKE_PREFIX_PATH 会影响其他一些搜索过程。例如,如果 3rd 方包提供 &lt;name&gt;Config.cmake 脚本而不是 Find&lt;name&gt;.cmake 一个,则也会使用此变量搜索此脚本。 pkg_check_modules 还使用CMAKE_PREFIX_PATH 搜索描述包的.pc 文件。

CMAKE_PREFIX_PATH 变量可以设置为环境一(以平台相关和特定用途的方式),作为cmake 调用的参数:

cmake -DCMAKE_PREFIX_PATH=<additional-path> <other-parameters>

或在CMakeLists.txt 文件中。在最后一种情况下,最好追加搜索目录,这样你包的用户也可以为你的项目未附带的搜索包设置变量:

list(APPEND CMAKE_PREFIX_PATH "$CMAKE_SOURCE_DIR/dependencies")

注意,变量CMAKE_PREFIX_PATH 不影响搜索FindXXX.cmake 脚本本身。要指定脚本所在的目录,请使用CMAKE_MODULE_PATH 变量。

【讨论】:

谢谢,效果很好。奇怪的是,这么重要的选项却没有注明来帮助查找脚本。它是否有任何会“破坏”任何脚本的副作用? 直到在CMAKE_PREFIX_PATH中列出的目录,有一些部分或损坏的安装,或者在标准搜索后缀(lib/、lib64/、include/等)下有不相关的文件,设置这个变量应该不要伤害任何find 脚本。如果是这样,这就是find 脚本本身的问题。可能发生的最糟糕的事情是脚本可能会忽略CMAKE_PREFIX_PATH 中列出的目录。在这种情况下,应该检查具体的find 脚本。 我要补充的是,搜索Find&lt;name&gt;.cmake你应该使用CMAKE_MODULE_PATH来代替...... 我想补充一下,有关Find&lt;name&gt;.cmake脚本的更多信息,我建议阅读cmake手册中的find-modules页面。

以上是关于使用自定义目录提示 Find<name>.cmake 文件的主要内容,如果未能解决你的问题,请参考以下文章

CMake--模块的使用和自定义模块

vue-cli的使用(模板自定义本地配置,eslint的配置)

Linux

find命令的使用

如何使set :: find()适用于自定义类对象?

自定义消息提示框