【问题标题】:Using the mongodb cxx driver in a cmake c++ project在 cmake c++ 项目中使用 mongodb cxx 驱动程序
【发布时间】:2016-09-09 16:37:39
【问题描述】:

我是 cmake 的新手,我想使用 c++ 和最新的 mongodb cxx 驱动程序连接到 mongodb。我设法编译并安装了驱动程序,但现在我坚持在我的 cmake 项目中使用它。

我使用默认设置安装了 mongodb 驱动程序,所以它位于 /usr/local/lib/include/mongocxx/v_noabi/mongocxx 下。

在我的 cmake 文件中,我设法通过以下方式解决了包含问题:

include_directories(/usr/local/lib/include/mongocxx/v_noabi /usr/local/lib/include/bsoncxx/v_noabi)

但我不知道如何将驱动程序库实际链接到我的可执行文件。谁能帮帮我?

【问题讨论】:

    标签: c++ mongodb c++11 cmake mongodb-c


    【解决方案1】:

    我已经完成了链接所有在 mongocxx 驱动程序文档上链接的内容并使用 CMake 'find_package':

    find_package(libmongocxx REQUIRED)
    find_package(libbsoncxx REQUIRED)
    include_directories(${LIBMONGOCXX_INCLUDE_DIR})
    include_directories(${LIBBSONCXX_INCLUDE_DIR})
    include_directories("/usr/local/include/mongocxx/v_noabi")
    include_directories("/usr/local/include/bsoncxx/v_noabi")
    include_directories("/usr/local/include/libmongoc-1.0")
    include_directories("/usr/local/include/libbson-1.0")
    include_directories("/usr/local/lib")
    
    add_executable(YOUR_PROJECT ${SOURCE_FILES})
    
    target_link_libraries(YOUR_PROJECT ${LIBMONGOCXX_LIBRARIES})
    target_link_libraries(YOUR_PROJECT ${LIBBSONCXX_LIBRARIES})
    

    【讨论】:

    • 非常感谢,这对我帮助很大。我正在使用 macOS 并使用自制软件安装了 mongo-cxx-driver。根据配置(/usr/local/Cellar/mongo-cxx-driver/3.1.1/lib/cmake/libmongocxx-3.1.1/libmongocxx-config.cmake),它设置了include dirs和lib dirs如下: set_and_check(LIBMONGOCXX_INCLUDE_DIRS "${PACKAGE_PREFIX_DIR}/include/mongocxx/v_noabi")
    • 我的配置是 INCLUDE_DIRECTORIES( ${LIBBSONCXX_INCLUDE_DIRS} ${LIBMONGOCXX_INCLUDE_DIR}) 并且不需要添加以下2个绝对路径。嗯,没有冒犯,这只是希望如果它有一些信息可以帮助更多的人
    • 我的意思是 LIBBSONCXX_INCLUDE_DIR 与 LIBBSONCXX_INCLUDE_DIR[S]
    • 确实,我使用了包含目录变量,末尾带有“S” include_directories(${LIBMONGOCXX_INCLUDE_DIRS})
    • @datatype_void 为我迟到的回复道歉。您也可以将这些库附加到 COMMON_LIBRARIES
    【解决方案2】:

    你不应该那样做。您可以并且应该通过 CMake 的 find_packagepkg_check_modules 子系统找到 C++11 驱动程序。 C++11 驱动程序支持两者。

    【讨论】:

    • @paddy_89 很高兴听到您成功了。对有帮助的答案投赞成票并接受最佳答案被认为是有礼貌的。
    • @paddy_89 请您接受这个答案是正确的,以便其他查看该问题的人知道答案是正确的吗?
    【解决方案3】:

    这对我有用:

    cmake_minimum_required(VERSION 3.10)
    project(cmongodb)
    
    set(CMAKE_CXX_STANDARD 14)
    
    find_package(libbsoncxx-static REQUIRED)
    find_package(libmongocxx-static REQUIRED)
    
    include_directories(${LIBMONGOCXX_STATIC_LIBRARIES})
    include_directories(${LIBBSONCXX_STATIC_LIBRARIES})
    include_directories(${LIBMONGOCXX_STATIC_INCLUDE_DIRS})
    include_directories(${LIBBSONCXX_STATIC_INCLUDE_DIRS})
    
    message(STATUS "${LIBMONGOCXX_STATIC_LIBRARIES}")
    message(STATUS "${LIBMONGOCXX_STATIC_INCLUDE_DIRS}")
    
    message(STATUS "${LIBBSONCXX_STATIC_LIBRARIES}")
    message(STATUS "${LIBBSONCXX_STATIC_INCLUDE_DIRS}")
    
    add_executable(cmongodb main.cpp mymongo.cpp mymongo.h)
    
    target_link_libraries(cmongodb ${LIBMONGOCXX_STATIC_LIBRARIES} ${LIBBSONCXX_STATIC_LIBRARIES})
    

    在这里,我在前缀静态中安装 mongo db。通常情况下,你会全部搞砸

    static_STATIC

    【讨论】:

      【解决方案4】:

      在 macOS Mojave 上的 CLion 中设置 MongoDB C++ 驱动程序的步骤:

      1. brew install mongo-cxx-driver(如果您遇到任何错误提示缺少某些内容,请 brew install 它)

      2. 打开 CLion 并为 MongoDB 文档提供的 hello world 代码创建一个文件:

          #include <iostream>
          
          #include <bsoncxx/builder/stream/document.hpp>
          #include <bsoncxx/json.hpp>
          
          #include <mongocxx/client.hpp>
          #include <mongocxx/instance.hpp>
          
          int main(int, char**) {
              mongocxx::instance inst{};
              mongocxx::client conn{mongocxx::uri{}};
          
              bsoncxx::builder::stream::document document{};
          
              auto collection = conn["testdb"]["testcollection"];
              document << "hello" << "world";
          
              collection.insert_one(document.view());
              auto cursor = collection.find({});
          
              for (auto&& doc : cursor) {
                  std::cout << bsoncxx::to_json(doc) << std::endl;
              }
          }
      
      1. 通过将CMakeLists.txt 设置为:让 CLion 知道在哪里可以找到驱动程序文件:
      # replace PROJECT_NAME by the name of your clion project
      
      cmake_minimum_required(VERSION 3.15)
      project(PROJECT_NAME)
      
      set(CMAKE_CXX_STANDARD 14)
      
      add_executable(PROJECT_NAME main.cpp)
      
      find_package(libmongocxx REQUIRED)
      find_package(libbsoncxx REQUIRED)
      include_directories(${LIBMONGOCXX_INCLUDE_DIR})
      include_directories(${LIBBSONCXX_INCLUDE_DIR})
      include_directories("/usr/local/include/mongocxx/v_noabi")
      include_directories("/usr/local/include/bsoncxx/v_noabi")
      include_directories("/usr/local/include/libmongoc-1.0")
      include_directories("/usr/local/include/libbson-1.0")
      include_directories("/usr/local/lib")
      
      
      target_link_libraries(PROJECT_NAME ${LIBMONGOCXX_LIBRARIES})
      target_link_libraries(PROJECT_NAME ${LIBBSONCXX_LIBRARIES})
      

      需要 5 分钟,没有 C 驱动程序,在尝试构建驱动程序时不会遇到奇怪的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-02
        • 1970-01-01
        相关资源
        最近更新 更多