使用自定义目录提示 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<name>.cmake
脚本使用 find_library 和 find_path 函数。请注意,所有find_*
函数都有精确算法 用于搜索项,并且使用CMAKE_PREFIX_PATH
构造的路径在系统路径之前检查。
此外,CMAKE_PREFIX_PATH
会影响其他一些搜索过程。例如,如果 3rd 方包提供 <name>Config.cmake
脚本而不是 Find<name>.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<name>.cmake
你应该使用CMAKE_MODULE_PATH
来代替......
我想补充一下,有关Find<name>.cmake
脚本的更多信息,我建议阅读cmake手册中的find-modules页面。以上是关于使用自定义目录提示 Find<name>.cmake 文件的主要内容,如果未能解决你的问题,请参考以下文章