gpt4 book ai didi

CMAKE_PREFIX_PATH 和 CMAKE_MODULE_PATH 都是空的,find_package 仍然有效

转载 作者:行者123 更新时间:2023-12-05 04:53:28 26 4
gpt4 key购买 nike

我是 cmake 的新手,目前正在学习 find_package()

来自 doc : find_package

In Module mode, CMake searches for a file called Find.cmake. The file is first searched in the CMAKE_MODULE_PATH, then among the Find Modules provided by the CMake installation. If the file is found, it is read and processed by CMake. It is responsible for finding the package, checking the version, and producing any needed messages. Some find-modules provide limited or no support for versioning; check the module documentation.

例如,如果我键入 find_package(OpenCV) 并使用以下命令运行 cmake_find_debug_mode:

cmake -DCMAKE_FIND_DEBUG_MODE=ON .

而且,实际上屏幕上打印的信息显示它首先尝试搜索 {我安装 cmake 的路径}/Modules/FindOpenCV.cmake 我认为但不确定是 CMAKE_MODULE_PATH,但没有找到,它一直在寻找,最后从我在一个脚本中定义的环境变量 OpenCV_DIR 中找到了OpenCVConfig.cmake

在我打印出消息之前我所期望的一切

message(STATUS "CMAKE_PREFIX_PATH : ${CMAKE_PREFIX_PATH}")
message(STATUS "CMAKE_MODULE_PATH : ${CMAKE_MODULE_PATH}")

第一个来自 doc定义为“用于 FIND_XXX() 搜索的路径,添加了适当的后缀”。

而且他们都什么都不返回...

我有两个问题:

(1) 为什么find_package${CMAKE_MODULE_PATH}都是空的?(2) 如何查看cmake定义的所有这些环境变量,例如CMAKE_MODULE_PATH?

谢谢!!

最佳答案

我会很简短。

您应该意识到的一件重要事情是,与 GNU Makefile 不同,CMake 变量和环境变量是不同的。您似乎在问题中混用了这些术语。

find_package 文档对其搜索过程非常精确。我相信如果你阅读了整篇文章,你可以自己回答这个问题。

不是不想详细回答。只是我无法比文档本身更清楚地解释。

相反,我只会提出一些要点:

  • CMAKE_MODULE_PATH是CMake搜索“Find Modules”的地方,即FindOpenCV.cmake,如果存在的话,在我们生活的这个世界上是不存在的, 因为下一点。

  • 因为OpenCV的作者提供了一个“Config”文件,所以不需要任何人写一个“Find Module”。 CMAKE_PREFIX_PATH 是 CMake 在许多 find_xxx API 中搜索的地方,包括 find_package,因为它将能够找到 OpenCVConfig.cmake,如果您正确设置了路径。但在您的情况下,它是空的。

  • 您已经设置了环境变量 OpenCV_DIR,这正是一切正常的原因。根据文档,此 var 有助于找到包:

Config mode search attempts to locate a configuration file provided bythe package to be found. A cache entry called PackageName_DIR iscreated to hold the directory containing the file. By default thecommand searches for a package with the name PackageName. If theNAMES option is given the names following it are used instead ofPackageName. The command searches for a file calledPackageNameConfig.cmake or lower-case-package-name-config.cmakefor each name specified. A replacement set of possible configurationfile names may be given using the CONFIGS option. The search procedureis specified below. Once found, the configuration file is read andprocessed by CMake. Since the file is provided by the package italready knows the location of package contents. The full path to theconfiguration file is stored in the cmake variable_CONFIG.

Search paths specified in cmake-specific environment variables. Theseare intended to be set in the user’s shell configuration, andtherefore use the host’s native path separator (; on Windows and : onUNIX). This can be skipped if NO_CMAKE_ENVIRONMENT_PATH is passed orby setting the CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH to FALSE:

PackageName_DIR

CMAKE_PREFIX_PATH

CMAKE_FRAMEWORK_PATH

CMAKE_APPBUNDLE_PATH


编辑:

问:为什么CMake可以找到OpenCV?

答:调用find_package(OpenCV)时,cmake会尝试从多个位置查找OpenCVConfig.cmake。我从来没有费心记住位置的顺序(因为我从来不需要)。

它将寻找:

  1. CMake 变量 CMAKE_PREFIX_PATH
  2. 环境变量CMAKE_PREFIX_PATH
  3. CMake 变量 OpenCV_DIR
  4. 环境变量OpenCV_DIR
  5. 还有更多...

注意:CMake变量是分号分隔的字符串,而Unix系统上的环境变量是冒号分隔的字符串。

根据您的描述,CMake 似乎是通过选项 #4 找到 OpenCV。

注意:请参阅文档了解更多详细信息,因为:

  • cmake 将尝试查找更多位置
  • 这些变量之间存在细微差别。 (例如,它们由不同的 find_package 参数等控制开/关)

通常,不会指定要在每个包的基础上查找的路径。这就是为什么更经常使用 CMAKE_PREFIX_PATH(选项 #1)的原因。 (不设置则默认为空)

一般是在命令行设置,像这样:

cmake -D CMAKE_PREFIX_PATH="/install/path0;/install/path1/;...;/install/pathn/" .....

然后 cmake 将迭代由 ; 分隔的每个路径。

但是,当然,每个包的基础都有其自身的值(value):如果您的电脑上安装了多个版本,则可以防止使用错误的版本(我已经看到太多 /usr/usr/local/),像这样:

cmake -DOpenCV_DIR=/path/to/the/version/I/meant/to/use .....

关于CMAKE_PREFIX_PATH 和 CMAKE_MODULE_PATH 都是空的,find_package 仍然有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66057135/

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