使用CMake查找特定于应用程序的子文件夹中的依赖项 尽管多年来对大规模C++应用程序进行编码,但我不理解FIDENSOLD包是如何在中型CGED项目中工作的,假设我自己想构建源到依赖包,而不是简单地依赖OpenCV、PCL或Boost等大型系统安装在系统文件夹中的某个地方。我不敢相信我是世界上唯一一个发布过多个OpenCV和其他开源应用程序的人,在大型游戏项目中使用过NAnt和SCons等元构建系统,但我无法理解CMake如何工作的最基本的东西,也无法找到回答这些问题的教程

使用CMake查找特定于应用程序的子文件夹中的依赖项 尽管多年来对大规模C++应用程序进行编码,但我不理解FIDENSOLD包是如何在中型CGED项目中工作的,假设我自己想构建源到依赖包,而不是简单地依赖OpenCV、PCL或Boost等大型系统安装在系统文件夹中的某个地方。我不敢相信我是世界上唯一一个发布过多个OpenCV和其他开源应用程序的人,在大型游戏项目中使用过NAnt和SCons等元构建系统,但我无法理解CMake如何工作的最基本的东西,也无法找到回答这些问题的教程,c++,opencv,image-processing,boost,cmake,C++,Opencv,Image Processing,Boost,Cmake,在过去,我基本上不理解find_包,而是手工设置所有foo_DIR值,就像CMake抱怨的那样,直到我得到一个工作文件夹 我想通过一个简单的例子,我现在正在工作,并衷心希望有人能解释我做错了什么 首先,一些假设: 我想为MacOS和Windows构建一切,最好是通过CMakeGUI。MacOS应该构建Xcode项目,Windows应该构建Visual Studio解决方案 在有依赖项的地方,我想自己编译它们,这样我就有了调试符号,可以修改依赖项源(或者至少调试到其中) 不在系统文件夹中安装预构建

在过去,我基本上不理解find_包,而是手工设置所有foo_DIR值,就像CMake抱怨的那样,直到我得到一个工作文件夹

我想通过一个简单的例子,我现在正在工作,并衷心希望有人能解释我做错了什么

首先,一些假设: 我想为MacOS和Windows构建一切,最好是通过CMakeGUI。MacOS应该构建Xcode项目,Windows应该构建Visual Studio解决方案

在有依赖项的地方,我想自己编译它们,这样我就有了调试符号,可以修改依赖项源(或者至少调试到其中) 不在系统文件夹中安装预构建的二进制文件,即不在mac上使用sudo端口安装opencv/pcl等。 我有多个项目,更喜欢将一个项目及其依赖项保存在一个文件夹中。 为了一个具体的例子,假设我正在建设这个项目,尽管这是一个任意的选择来说明我所经历的过程和困惑:

这列出了依赖项,我特意在这里对其重新排序,以便按顺序排列,如下所示:

find_package(OpenCV REQUIRED)
find_package(Eigen REQUIRED)
find_package(Boost 1.40 COMPONENTS program_options REQUIRED )
find_package(PCL REQUIRED)
find_package(VTK REQUIRED)
我希望所有这些依赖项都在一个路径中下载和配置(比如Windows上的c:\src,为了简单起见,Mac上的~\src),而不是在系统路径中。假设实际文件夹是此项目的子文件夹,而不是所有项目的子文件夹。这还应允许在同一台计算机上并行安装多个项目

一步一个脚印:

(1) 我从克隆openCV,同步到标签3.1,配置到文件夹openCV\u build文件夹,构建并安装到openCV\u install。我已经做过很多次了,这很简单。 (2) 如上所述,但对于eigen(尽管为eigen构建实际上并没有做任何事情),它是一个模板库

Taking directory为下载的依赖项显示了一系列文件夹。我假设了一个约定,其中和是源repo,它们下面的构建文件夹是cmakgui中的“在哪里构建二进制文件”文件夹

$ ls
boost_1_40_0    opencv  opendetection_build
eigen   opencv-build    opendetection_data
eigen_build opencv_contrib  pcl
eigen_install   opendetection
到目前为止一切都很好,现在让我们尝试配置opendetection并在opendetection_build中生成一个解决方案,并从~/src文件夹中查找pendetection的依赖项,也就是前两个依赖项,我希望在opencv build和eigen build文件夹中找到opencv和eigen

正如预期的那样,OpenCV立即失败,它说:

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.
这很好,因为我想明确地告诉CMake在我的~/src文件夹下查找依赖包。问题:使用CMake_PREFIX_PATH=/users/foo/src是否是实现我想要的功能的推荐方法—查找特定路径下的所有子包

接下来,CMake会找到OpenCV(good),并设置OpenCV_DIR=/Users/foo/src/OpenCV build

问题:鉴于我已经对opencv安装进行了“安装”(使用CMAKE_install_前缀并构建opencv的安装目标),它不应该在opencv安装文件夹中找到opencv而不是opencv build吗

转到Egeng,我已经配置并构建了Egeng,并将其安装到~/src/eigen install,因为它是CMAKE_PREFIX_PATH(~/src)的子文件夹我可能期望被找到。但似乎不是。有人能解释一下我不理解的地方吗?特别是考虑到模板库中的Egen,并且至少有三个文件夹(Egen、Egen_构建和Egen_安装)在CMAKE_PREFIX_路径下,我认为CMAKE会在其中找到一些东西,我想我一定是做错了什么。根据过去的经验,我可以在CMakeGUI中手动设置EIGEN_INCLUDE_DIR,并继续进行黑客攻击,但这似乎是错误的


我非常愿意写一个网页来解释这一点,如果还没有的话,我会给未来像我这样愚蠢的人,尽管我不明白如何使用CMake进行基本的项目配置和生成对每个人来说都是显而易见的,但对我来说却是不透明的。实际上,我已经使用CMake好几年了,通常只是手工操作手动设置Boost_INCLUDE_Dir、Foo_INCLUDE_PATH等,但显然这不是正确的解决方案。通常,在花了几天时间,通过手动设置INCLUDE PATH、LIBRARY PATH和其他选项来生成解决方案后,我只处理该解决方案,不再触碰CMake。但我会我很想了解我在为我的客户提供的find_软件包中遗漏了什么(当然并不少见)想要控制我的项目依赖关系而不仅仅是使用sudo port install*并将项目的随机版本安装到我的全局系统文件夹的用例。

正如错误消息所说,
CMAKE_PREFIX_PATH
应设置为包的安装前缀。例如,如果包是使用CMAKE构建的,则这是
C使_INSTALL_PREFIX
变量的值,如果包是使用自动工具生成的,则这是用于配置它的
--PREFIX
选项的值,依此类推

CMake不会搜索CMake_PREFIX_PATH下的每个目录。这就是为什么如果在