CMake 问题 - 找不到“OpenCV”提供的包配置文件

Posted

技术标签:

【中文标题】CMake 问题 - 找不到“OpenCV”提供的包配置文件【英文标题】:CMake issues -- Could not find a package configuration file provided by "OpenCV" 【发布时间】:2020-10-15 20:17:01 【问题描述】:

我在使用 Cmake 构建项目时遇到问题,这是我以前从未做过的。我是 C++ 以及 Cmake 和 Makefile 概念的新手。我正在尝试从 GitHub 上的一些代码重新创建一些结果。如果您想更详细地查看说明/文件,可以在此处找到:

https://github.com/jan-dufek/Fotokite

所以基本上他列出了四个步骤:

1-)安装 CMake:

https://cmake.org

2-) 在终端中,将目录切换到项目的根目录并运行以下命令生成makefile:

cmake .

3-) 编译项目:

制作

4-) 运行:

./Fotokite


基本上我现在停留在第二步,因为在导航到文件夹并运行“cmake”后,我的终端中不断出现以下错误。

The C compiler identification is AppleClang 11.0.3.11030032
The CXX compiler identification is AppleClang 11.0.3.11030032
Detecting C compiler ABI info
Detecting C compiler ABI info - done
Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/cc - skipped
Detecting C compile features
Detecting C compile features - done
Detecting CXX compiler ABI info
Detecting CXX compiler ABI info - done
Check for working CXX compiler: /Library/Developer/CommandLineTools/usr/bin/c++ - skipped     
Detecting CXX compile features
Detecting CXX compile features - done
CMake Error at CMakeLists.txt:5 (find_package):
By not providing "FindOpenCV.cmake" in CMAKE_MODULE_PATH this project has
asked CMake to find a package configuration file provided by "OpenCV", but
CMake did not find one.


Could not find a package configuration file provided by "OpenCV" with any
of the following names:

OpenCVConfig.cmake

opencv-config.cmake

Add the installation prefix of "OpenCV" to CMAKE_PREFIX_PATH or set
"OpenCV_DIR" to a directory containing one of the above files.  If "OpenCV"
provides a separate development package or SDK, be sure it has been
installed.

我也将 OpenCV 下载到我的桌​​面上,我尝试将路径合并到 Cmake 文件中,但仍然没有任何运气。

这里也是 Cmakelists.txt:

cmake_minimum_required(VERSION 2.8)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY $CMAKE_BINARY_DIR/bin)
project(Fotokite)
find_package(OpenCV REQUIRED)
include_directories($OpenCV_INCLUDE_DIRS)
file(GLOB SOURCES
*.h
*.hpp
*.cpp
)
list(FILTER SOURCES EXCLUDE REGEX "main.*.cpp")
list(FILTER SOURCES EXCLUDE REGEX "Visualization.*")
foreach (FILE "" Takeoff GoToWaypoint ExecutePath Land)
add_executable(Fotokite$FILE $SOURCES main$FILE.cpp)
target_link_libraries(Fotokite$FILE $OpenCV_LIBS pthread)
endforeach(FILE)

第一次在这个网站上发帖,如果有什么不清楚的地方,我很抱歉,如果可以的话,我可以提供更多的细节!期待您的回复。

【问题讨论】:

解决这个问题的关键是遵循错误信息的建议。它会准确告诉您要做什么:将“OpenCV_DIR”设置为包含上述文件之一的目录。您可以在 CMake-Gui 或 ccmake 中执行此操作,也可以通过 - D cmake 的命令行选项 谢谢,我继续将 opencv 目录放入我的项目文件夹并配置/生成构建!现在我处于运行“make”的第三步,它在过去 30 分钟内一直在构建。这是典型的构建需要这么长时间吗?? 可能取决于项目和您的机器有多少内核。 所以我在运行 $make 后得到了 100% 的构建,但现在我对运行项目文件夹中的各个文件感到困惑。我在终端中运行了 g++ Fotokite.cpp,但现在我遇到了“opencv2/core.hpp”问题。在运行 $make 以运行文件夹中的文件后,我应该使用特定的命令吗 我认为问题是通过将opencv源复制到项目目录而产生的。您可能想使用 CMake 单独构建 OpenCV。 【参考方案1】:

以下错误消息详细说明了问题的原因:

CMakeLists.txt:5 (find_package) 处的 CMake 错误:不提供 CMAKE_MODULE_PATH 中的“FindOpenCV.cmake”这个项目询问了 CMake 找到“OpenCV”提供的包配置文件,但 CMake 没找到。

找不到“OpenCV”提供的包配置文件 以下任何名称:

OpenCVConfig.cmake

opencv-config.cmake

将“OpenCV”的安装前缀添加到CMAKE_PREFIX_PATH或设置 “OpenCV_DIR”到包含上述文件之一的目录。如果 《OpenCV》提供了单独的开发包或SDK,请务必 已安装。

这意味着当调用find_package 时,CMake 有两种查找依赖项的模式,“模块”模式和“配置”模式。模块模式意味着它可以在 CMakes 模块路径的某个位置找到一个名为 FindOpenCV.cmake 的文件。默认情况下,CMake 附带许多预先准备好的查找模块,但是,默认情况下它不附带用于 OpenCV 的模块。在这种情况下,您可以自己添加它(只需 google 查找 FindOpenCV.cmake,您会找到示例)但是这是错误的方法,我会解释原因。

当您使用 CMake 生成库构建时,如果您希望有依赖于您的库的下游客户端,那么您应该使其易于使用。 CMake 通过“配置”模式支持这一点。当您使用 CMake 编写库作为安装步骤的一部分时(可以运行此步骤以在构建后将库打包到一组可安装的文件和文件夹结构中)。您可以在此处查看如何为项目进行设置的示例:https://gitlab.kitware.com/cmake/community/-/wikis/doc/tutorials/How-to-create-a-ProjectConfig.cmake-file。此时您不需要知道如何执行此操作,只需库应该执行此操作,因为它们具有正确导出库目标的信息。如果他们不这样做,那么用户就必须以“模块”模式访问库,这涉及创建一个find<library>.cmake,该指令详细说明如何定位文件。

但是,幸运的是,使用 CMake 的 OpenCV 确实正确地创建并安装了一个 OpenCVConfig.cmake 文件,允许用户使用“配置”模式来访问它。这里的问题似乎是您尚未将 OpenCV 安装到“配置”模式默认搜索的标准系统安装目录之一。此处详细介绍了搜索位置列表:https://cmake.org/cmake/help/v3.19/command/find_package.html。要解决此问题,您可以将 PATH 参数传递给 find_package,以便它在其他位置查找:

find_package(OpenCV REQUIRED PATH <location to OpenCV installation>)

【讨论】:

感谢您的回复!我发现使用 brew install 解决了这个问题! 太棒了,很高兴你解决了它!是的,brew install 将在系统安装位置放置一个副本,CMake 默认应该能够找到该位置。【参考方案2】:

我在使用 buildroot 构建某些东西时遇到了类似的问题。

当我查看日志时,发现

>>> xxxxxx Configuring
>>> xxxxxx Installing to target
xxxxxxxxxxxxxx  DESTDIR= xxxxxxxxxxxxxxx

请仔细查看 DESTDIR 变量。它可能会受到 xxx.mk 文件中的“FOO_INSTALL_STAGING = YES”命令的影响。

【讨论】:

以上是关于CMake 问题 - 找不到“OpenCV”提供的包配置文件的主要内容,如果未能解决你的问题,请参考以下文章

CMake - OpenCV - 找不到 -lDisplayImage

cmake 错误 - 找不到 opencv 库或头文件

魔改Cmake系列:编译caffe的时候找不到OpenCV

魔改Cmake系列:编译caffe的时候找不到OpenCV

CMake - 找不到“QT”提供的包配置文件

用于 openCV 的 CMake