我需要使用mangrove ( mongo -c-driver和mongo-cxx-driver之上的mongo ODM lib ),并将其作为CMake ExternalProject_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的是下一个包含的外部项目- mangrove所需要的。
由于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_directories似乎不会影响ExternalProject_Add包含的基于CMake的项目。
是否有技术可以将这些包含路径传递到外部项目?
发布于 2018-12-30 01:44:08
您使用了错误的宏。CMAKE_INCLUDE_DIRECTORIES_BEFORE仅指示include-directories的工作方式,是一个flag。
没有其他选项可以设置适当的变量,以便外部CMakeLists.txt使用find_path填充到bson.h的路径。如果没有,那么我建议你给CMakeLists.txt打补丁,让它使用find_path,并发出一个拉取请求。
编辑:
看起来红树林项目有一种用ENABLE_BSON来设置这一切的方法。如果默认的AUTO不起作用,您可以手动设置BSON_VERSION、BSON_INCLUDE_DIRS和BSON_LIBRARIES。
发布于 2018-12-30 02:59:34
正如在其他答案中所指出的,您不能将包含传递给mangrove项目,并且外部项目和当前项目都是彼此独立的。
这似乎是问题的一半。看起来您正在尝试使用mongo-c-driver来提供libbson。但mangrove正在使用:
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能够找到库并设置包含路径和链接线。
似乎mangrove发现了一些东西,允许find_package不会失败,但没有用正确的包含路径填充${LIBBSON_INCLUDE_DIRS},这导致了您提到的编译错误。
如果没有具体细节,很难给您一个详细的答案,但您需要确保mangrove中的find_package命令能够正确地与已构建且未安装的libbson一起工作,或者将libbson安装在与mangrove使用的find_package命令兼容的位置。
https://stackoverflow.com/questions/53971738
复制相似问题