Cmake 覆盖给定目标的 find_package

标签 cmake

我们有一个 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>_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 或环境一)来提示包位置,例如 <package>_DIR , <package>_ROOT或者。

    但是,几乎所有此类脚本仅将提示变量视为额外的搜索位置,因此如果变量设置为错误值,它们会直接忽略它。如果不修改脚本,您就无法更改该行为。
  • 关于Cmake 覆盖给定目标的 find_package,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44139301/

    相关文章:

    c++ - 管理 cmake 依赖 git 模块

    c++ - 如何通过cmake使用-fPIC编译jsoncpp

    c++ - CMake add_library(<lib> OBJECT <src>) 有环境变量吗?

    C++ 库组织

    ubuntu - -dev 包的实际构建命令是什么?

    c++ - 为什么将函数传递给内核会导致数据变得不可变?

    visual-studio-2012 - 使用ExternalProject_Add后缺少项目

    c++ - 我应该使用 cmake 搜索什么 Boost 包才能包含 Boost Function 的代码?

    c++ - 使用cmake -G时如何指定输出路径?

    opencv - 从 Cmake 运行编译文件时出现段错误