gpt4 book ai didi

Cmake 覆盖给定目标的 find_package

转载 作者:行者123 更新时间:2023-12-04 12:12:03 31 4
gpt4 key购买 nike

我们有一个 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/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com