我们有一个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)
答案 0 :(得分:3)
如果软件包提供<package>Config.cmake
脚本,用户可以指定<package>_DIR
CMake变量来查找此脚本。
find_package()
的 NO_DEFAULT_PATH 选项可能会禁用在该情况下搜索其他地方。
如果使用Find<package>.cmake
脚本搜索包,则如果用户提供提示变量但是错误,则没有(通用)方法禁用搜索其他位置。
首先,CMAKE_PREFIX_PATH
为所有包提供附加安装树。由于此变量适用于所有 find_package()
次调用,因此要求在其下找到所有包是不明智的。
当谈到指定特定包的安装目录的方法时,我们需要区分两种“查找”脚本:
<package>Config.cmake
(或其他一些替代名称,请参阅find_package documentation)。
这些脚本随包自身一起提供。并且通用方式供用户指定此类软件包的位置: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或环境1)提示包位置,如<package>_DIR
,<package>_ROOT
左右。
但是,几乎所有此类脚本都将提示变量视为附加搜索位置,因此如果将变量设置为错误值,则只需忽略它。如果不修改脚本,就无法改变这种行为。