C++ cmake include_目录传递给externaproject_add
我需要使用红树林(mongo-c-driver和mongo-cxx-driver上的mongo-ODM-lib),并将其作为CMakeC++ 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
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
。这没什么大不了的,但因此出现了错配。