我们有一个 CMakeLists.txt 链接(例如)opencv 到我们的各种二进制文件。这是按如下方式完成的:
find_package(OpenCV REQUIRED core imgproc highgui contrib) 
target_link_library(XXX opencv_core)
我们还希望允许构建库的人提供自己的 opencv 库。似乎可以将 -DCMAKE_PREFIX_PATH 设置为正确的路径来完成。
cmake -DCMAKE_PREFIX_PATH=".../mybuild/include;.../mybuild/lib" .  
但是,我想确保所使用的库正是客户端指定的库(即,如果 /mybuild/lib 中没有任何内容,则配置失败)。
我怎样才能允许构建库的人覆盖使用的库?(如果没有指定它应该回退到 find_package-s)
如果包提供<package>Config.cmake脚本,用户可以指定<package>_DIRCMake 变量来定位此脚本。
在这种情况下搜索其他地方可能会被禁止使用NO_DEFAULT_PATH选项find_package()。
如果使用Find<package>.cmake脚本搜索包,如果用户提供提示变量但它是错误的,则没有(通用)方法可以禁用搜索其他地方。
首先,为所有包CMAKE_PREFIX_PATH提供额外的安装树。由于此变量应用于所有 find_package()调用,因此要求在其下找到所有包是不明智的。
在谈到为特定包指定安装目录的方式时,我们需要区分两种“查找”脚本:
<package>Config.cmake(或一些替代名称,请参阅find_package 文档)。
这些脚本随包本身一起提供。而且有普遍的方式为用户指定这样的包的位置:CMake的变量<package>_DIR,它应该指向与目录*Config.cmake的脚本。
虽然默认行为find_package()将<package>_DIR变量视为附加提示,但传递NO_DEFAULT_PATH选项会禁用所有隐式路径:
if(<package>_DIR) # Variable is set by the user or by previous `cmake` run.
    # Search only under given directory.
    find_package(<package> NO_DEFAULT_PATH) 
else()
    # Search everywhere (as documented for 'find_package').
    find_package(<package>) 
endif()
Find<package>.cmake.
此脚本要么随 CMake 一起提供,要么应随项目一起提供。
大多数此类脚本允许使用变量(CMake 或环境一)来提示包位置,例如<package>_DIR,<package>_ROOT等等。
但是,几乎所有此类脚本仅将提示变量视为额外的搜索位置,因此如果变量设置为错误值,它们会直接忽略它。如果不修改脚本,您就无法更改该行为。