- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 cmake 的新手,目前正在学习 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
。我从来没有费心记住位置的顺序(因为我从来不需要)。
它将寻找:
CMAKE_PREFIX_PATH
CMAKE_PREFIX_PATH
OpenCV_DIR
OpenCV_DIR
注意:CMake变量是分号分隔的字符串,而Unix系统上的环境变量是冒号分隔的字符串。
根据您的描述,CMake 似乎是通过选项 #4 找到 OpenCV。
注意:请参阅文档了解更多详细信息,因为:
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/
我正在 Windows、Linux、MacOS、WebAssembly、iOS 和 Android 上编译相同的 Qt/QML 应用程序。到目前为止,我发现Qt的组件检测只适用于Windows,无论我
我的全局环境变量CMAKE_PREFIX_PATH有问题.我已经设置了这个,当我输入 env 时我可以看到它被设置了,但是当我运行时 cmake .要构建 HipHop,它告诉我变量未设置。 有没有办
在我开发的一个项目中,我们使用 cmake 来编译我们的服务。目前,我们需要从 3 个不同位置获取 Qt 数据,我很好奇是否有一种方法可以在三个单独的命令上运行一个 cmake 命令。 我们目前使用的
我要编译this这需要 Qt 5.14,我从我的 Linux 存储库安装了 Qt 5.12。我刚刚从源代码编译了 Qt 并将其安装在 /usr/local/Qt-6.0.0/ (默认位置)。 但是 C
我要编译this这需要 Qt 5.14,我从我的 Linux 存储库安装了 Qt 5.12。我刚刚从源代码编译了 Qt 并将其安装在 /usr/local/Qt-6.0.0/ (默认位置)。 但是 C
如果我跑 cmake -DCMAKE_PREFIX_PATH=/home/rip/Qt/5.12.1/gcc_64/lib/cmake 一切正常。但是如果我写 set(CMAKE_PREFIX_PAT
我正在尝试编译一个使用 CMake 的项目和 pkg_check_modules我无法获得 pkg_check_modules查找位于 CMAKE_PREFIX_PATH 下的库. 我相信下面的例子重
我是 cmake 的新手,目前正在学习 find_package() 来自 doc : find_package In Module mode, CMake searches for a file c
我正在使用 Android CMake 工具链将 CMake C 和 C++ 游戏移植到 Android。 项目的库依赖项存储在 PROJECTDIR/android_dependencies 中,我
来自这里:https://stackoverflow.com/a/28327499/462608 我试过这个: cmake_minimum_required(VERSION 2.8.12) proje
我已经从http://face.ci2cv.net/下载了人脸分析SDK的源码.现在我正试图让它运行。我下载了所有必要的软件并按照安装说明进行操作。当我尝试执行 cmake [options] ..
我是一名优秀的程序员,十分优秀!