Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ cmake include_目录传递给externaproject_add_C++_Cmake_Mongo C Driver - Fatal编程技术网

C++ cmake include_目录传递给externaproject_add

C++ cmake include_目录传递给externaproject_add,c++,cmake,mongo-c-driver,C++,Cmake,Mongo C Driver,我需要使用红树林(mongo-c-driver和mongo-cxx-driver上的mongo-ODM-lib),并将其作为CMakeExternalProject\u Add命令包含在我的项目中,依赖项为mongo-c-driver/mongo-cxx-driver # mongo-c-driver ExternalProject_Add(mongo-c-driver GIT_REPOSITORY https://github.com/mongodb/mongo-c-drive

我需要使用红树林(mongo-c-driver和mongo-cxx-driver上的mongo-ODM-lib),并将其作为CMake
ExternalProject\u Add
命令包含在我的项目中,依赖项为mongo-c-driver/mongo-cxx-driver

# mongo-c-driver
ExternalProject_Add(mongo-c-driver
        GIT_REPOSITORY https://github.com/mongodb/mongo-c-driver.git
        GIT_TAG r1.12
        CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_LOCATION} -DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF
#        CMAKE_ARGS -DINCLUDE_DIRECTORIES=${EXTERNAL_INSTALL_LOCATION}/include/libbson-1.0 ${EXTERNAL_INSTALL_LOCATION}/include/libmongoc-1.0
        )

#include_directories(${EXTERNAL_INSTALL_LOCATION}/include/libbson-1.0
#        ${EXTERNAL_INSTALL_LOCATION}/include/libmongoc-1.0)
#link_directories(${EXTERNAL_INSTALL_LOCATION}/lib)
include_directories
此处的命令实际上不是必需的,因为mongoc的cmake配置文件可以实现这一点。当然,我也检查了uncommented

因此,下一个包含的外部项目-红树林需要来自mongo-c-driver的包含

由于C++错误而失败,没有找到一些包含文件,这些文件存在于当前项目的包含路径中。所以,包含的外部项目似乎并没有使用当前的CMake包含,它以前是由另一个外部项目添加的

# mangrove
ExternalProject_Add(mangrove
        GIT_REPOSITORY https://github.com/aospan/mangrove.git
        CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_LOCATION} -DCMAKE_INCLUDE_DIRECTORIES_BEFORE=${EXTERNAL_INSTALL_LOCATION}/include/libbson-1.0
        )

ExternalProject_Add_StepDependencies(mangrove build mongo-c-driver mongo-cxx-driver)

include_directories(${EXTERNAL_INSTALL_LOCATION}/include/libbson-1.0
        ${EXTERNAL_INSTALL_LOCATION}/include/libmongoc-1.0)
link_directories(${EXTERNAL_INSTALL_LOCATION}/lib)
脚本中的
include\u目录
似乎不会影响
ExternalProject\u Add所包含的基于CMake的项目


是否有一种技术可以将这些包含路径传递到外部项目

您使用了错误的宏
CMAKE\u INCLUDE\u DIRECTORIES\u BEFORE
仅表示
INCLUDE DIRECTORIES
的工作方式,是一个重要的功能

没有其他选项可以设置正确的变量,以便外部CMakeLists.txt使用
find_path
填充到
bson.h
的路径。如果没有,那么我建议您修补CMakeLists.txt以使用
查找路径
并发出拉取请求

编辑:


红树林项目似乎有办法通过
ENABLE\u BSON
设置所有这些。然后,您可以设置
BSON\u版本
BSON\u如果默认的
AUTO
不起作用,则手动包含DIRS
BSON\u库

如其他答案中所述,您不能将包含传递到
红树林
项目,并且外部项目和当前项目都是相互独立的

这似乎是问题的一半。看起来您正试图使用
mongo-c-driver
来提供
libbson
。但是红树林正在使用:

set(LIBBSON_REQUIRED_VERSION 1.7.0)
set(LIBBSON_REQUIRED_ABI_VERSION 1.0)
find_package(LibBSON ${LIBBSON_REQUIRED_VERSION} REQUIRED)
不太清楚的是
find_package
是否在模块或配置模式下运行,以及结果是什么。但要使其成功运行,需要在构建
mongo-c-driver
时构建
libbson
,以便
find_package
可以找到库并设置包含路径和链接行

似乎
红树林
发现了一些允许
find_包
不会失败的东西,但是没有用正确的包含路径填充
${LIBBSON_INCLUDE_DIRS}
,这导致了您提到的编译错误


如果没有具体说明,很难给出详细的答案,但您需要确保
红树林
中的
find_包
命令与已构建且未安装的
libbson
正常工作,或者将
libbson
安装在与所使用的
find_包
命令兼容的位置
红树林

我做了我能做的,但我仍然无法理解你的一些短语。如果找不到bson库,请设置bson变量,以便正确填充。是。找不到bson.h(错误消息),我甚至尝试手动指定路径,甚至使用该bson.h的绝对路径-问题仍然存在,对我来说,这意味着项目cmakelists.txt中的inclde路径不会影响由ExternalProject添加到主项目中的cmakelists.txt。\u add他们不会,这是另一个项目。但另一个项目应该有一个合适的方法来填充bson包含路径。这就是你应该寻找合适变量的地方。所以,是的,问题是如何为外部项目设置合适的变量(这里是mangove)。这是我在ExternalProject_Add中做的尝试。但这似乎有点问题,它不起作用:CMAKE_ARGS-DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_LOCATION}-DCMAKE_INCLUDE_DIRECTORIES_BEFORE=${EXTERNAL_INSTALL_LOCATION}/INCLUDE/libbson-1.0你是对的,红树林的作者似乎没有研究mongo-cmake配置——他们试图在项目中设置包含项时使用了错误的变量,有一个
ENABLE\u BSON=SYSTEM
可以自动设置变量,您可以为其设置
CMAKE\u INCLUDE\u PATH
。感谢您的建议,但是我必须提供一个不需要先决条件的项目,这就是我使用externalproject的原因。externalproject是从Github下载并自动构建的。谢谢你的回复。如果我们查看libbson-1.0-config.cmake,我们可以看到:set_和_check(BSON_INCLUDE_DIRS“${PACKAGE_PREFIX_DIR}/INCLUDE/libbson-1.0”),但是红树林cmakelists.txt出于某种原因使用libbson_INCLUDE_DIRS(假设错误),因此使用此变量名称的简单修复程序使mangove成功构建,不幸的是,红树林目前看起来仍然不稳定且不受支持,我的同事修复了代码中的一些错误,你看,cmakelists也不正确,我发现了三个错误there@amigo421我一直认为它是
\u INCLUDE\u DIRS
。在这种情况下,您要查找的包名是
libbson
而不是
bson
。这没什么大不了的,但因此出现了错配。