在CMake中,是否有一种方法可以使内置的查找脚本优先考虑我们指定的自定义目录?特别是在Windows中,模块查找脚本通常无法检测到例如Visual Studio目录中的模块。因此,我通常必须手动设置外部库的路径,这非常繁琐。相反,我希望这些脚本首先查找一个自定义目录,比如主项目中的“dependencies”文件夹,这样我就可以直接将这些外部库放在该文件夹中,这比将它们放在VC文件夹中或手动设置路径要容易得多。
设置 CMAKE_PREFIX_PATH 变量正是为了这些目的:提示 find_*
函数搜索所需项的位置。
虽然该变量的描述没有提到 find_package
函数,但该变量间接影响它:大多数 Find<name>.cmake
脚本使用 find_library 和 find_path 函数。请注意,所有的 find_*
函数都有精确的搜索算法,并且使用 CMAKE_PREFIX_PATH
构造的路径会在系统路径之前进行检查。
此外,CMAKE_PREFIX_PATH
还会影响其他一些搜索过程。例如,如果第三方包提供了 <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
脚本。 - TsyvarevFind<name>.cmake
文件,你应该使用CMAKE_MODULE_PATH
。 - MizuxFind<name>.cmake
脚本的更多信息,我建议阅读 CMake 手册中的 find-modules 页面。 - jrh