2

我需要使用 mangrove(mongo ODM lib over mongo-c-driver 和 mongo-cxx-driver)并将其作为 CMakeExternalProject_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 配置文件可以完成这项工作。但是,可以肯定的是,我也检查了未注释的。

因此,下一个包含的外部项目 - mangrove 需要包含来自 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_directories不会影响ExternalProject_Add.

有没有一种技术可以将这些包含路径传递给外部项目?

4

3 回答 3

2

您使用了错误的宏。CMAKE_INCLUDE_DIRECTORIES_BEFORE仅指示如何include-directories工作并且是一个标志

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

编辑:

似乎红树林项目有办法用ENABLE_BSON. 然后,您可以设置BSON_VERSION,如果默认设置不起作用BSON_INCLUDE_DIRS,您可以手动设置。BSON_LIBRARIESAUTO

于 2018-12-29T17:44:08.493 回答
0

如其他答案所述,您不能将包含传递给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在模块或配置模式下运行以及它的结果是什么。但是为了成功工作libbson,需要在构建时mongo-c-driver构建,以便find_package可以找到库并设置包含路径和链接行。

似乎mangrove找到了一些允许find_package不会失败但没有${LIBBSON_INCLUDE_DIRS}使用正确的包含路径填充的东西,这导致了您提到的编译错误。

如果没有具体细节,很难给你一个详细的答案,但你需要确保其中的find_package命令mangrove可以正常工作,而不是安装libbson或安装在与所使用的命令libbson兼容的位置。find_packagemangrove

于 2018-12-29T18:59:34.037 回答
0

尝试与 mongo-c-driver 同时构建 mongo-cxx-driver 的问题相同,两者都作为超级构建中的外部项目

修复感觉有点粗糙,但这是在下一步将包含作为 CPLUS_INCLUDES_PATH 传递的情况:

Include(ExternalProject)
ExternalProject_Add(libmongoc
        GIT_REPOSITORY  https://github.com/mongodb/mongo-c-driver.git
        GIT_TAG         [tag]
        STEP_TARGETS    build
        SOURCE_DIR      "${CMAKE_BINARY_DIR}/libmongoc"
        BINARY_DIR      "${CMAKE_BINARY_DIR}/libmongoc-build"
        INSTALL_DIR     "${CMAKE_BINARY_DIR}/libmongoc-install"
        CMAKE_CACHE_ARGS
            ${common_cmake_cache_args}
            -DENABLE_AUTOMATIC_INIT_AND_CLEANUP:BOOL=OFF
            -DCMAKE_BUILD_TYPE:STRING=Release
            -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/libmongoc-install
            -DCMAKE_INSTALL_RPATH:PATH=${CMAKE_BINARY_DIR}/libmongoc-install
            -DENABLE_TESTS:BOOL=OFF
            -DENABLE_STATIC:BOOL=OFF
            -DENABLE_EXAMPLES:BOOL=OFF
            -DENABLE_EXTRA_ALIGNMENT:BOOL=OFF
            -DBUILD_SHARED_LIBS:BOOL=ON
)
set(libmongoc-1.0_DIR "${CMAKE_BINARY_DIR}/libmongoc-install/lib64/cmake/libmongoc-1.0")
set(libbson-1.0_DIR "${CMAKE_BINARY_DIR}/libmongoc-install/lib64/cmake/libbson-1.0")
set(libmongoc_hdrs "${CMAKE_BINARY_DIR}/libmongoc-install/include/libmongoc-1.0")
set(libbson_hdrs "${CMAKE_BINARY_DIR}/libmongoc-install/include/libbson-1.0")
set(all-includes "${libmongoc_hdrs}:${libbson_hdrs}")

ExternalProject_Add(libmongocxx
        GIT_REPOSITORY  https://github.com/mongodb/mongo-cxx-driver.git
        GIT_TAG         [tag]
        SOURCE_DIR      "${CMAKE_BINARY_DIR}/libmongocxx"
        BINARY_DIR      "${CMAKE_BINARY_DIR}/libmongocxx-build"
        INSTALL_DIR     "${CMAKE_BINARY_DIR}/libmongocxx-install"
        BUILD_COMMAND   CPLUS_INCLUDE_PATH=${all-includes} make
        CMAKE_CACHE_ARGS
            ${common_cmake_cache_args}
            -DCMAKE_BUILD_TYPE:STRING=Release
            -DMONGOC_INCLUDE_DIRS:PATH=${libmongoc_hdrs}
            -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/mongocxx-install
            -DCMAKE_INSTALL_RPATH:PATH=${CMAKE_BINARY_DIR}/mongocxx-install
            -DBUILD_SHARED_LIBS:BOOL=ON
            -DENABLE_TESTS:BOOL=OFF
            -DENABLE_EXAMPLES:BOOL=OFF
            -DBSONCXX_POLY_USE_BOOST:BOOL=OFF
            -DBSONCXX_POLY_USE_MNMLSTC:BOOL=ON
            -DBSONCXX_POLY_USE_STD:BOOL=OFF
            -Dlibmongoc-1.0_DIR:PATH=${libmongoc-1.0_DIR}
            -Dlibbson-1.0_DIR:PATH=${libbson-1.0_DIR}
        DEPENDS
            libmongoc
)
于 2022-01-30T13:33:50.053 回答