sql >> データベース >  >> NoSQL >> MongoDB

CMakeExternalProject_Addを使用してmongo-cxx-driverをビルドする

    予備的意見

    詳細を見ながら、ここにいくつかの予備的なコメントがあります:

    • SOURCE_DIRに別のディレクトリを使用する およびBINARY_DIR
    • CMAKE_ARGの代わりに 、CMAKE_CACHE_ARGSを優先します
    • libbson-1.0_DIR config-fileを含むビルドディレクトリに設定する必要がある場合は、ソースディレクトリに設定しないでください。 パッケージ(この概念の詳細については、以下のリンクを参照してください)
    • 必ずCMake引数のタイプを指定してください(-DCMAKE_CXX_COMPILER:PATH=${CMAKE_CXX_COMPILER} -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
    • CMAKE_BUILD_TYPEを設定しないでください マルチ構成ジェネレーター用

    この最後の点に関して、これはあなたが次のことをしなければならないことを意味します:

    set(EXTERNAL_PROJECT_OPTIONAL_CMAKE_CACHE_ARGS)
    if(NOT DEFINED CMAKE_CONFIGURATION_TYPES)
      list(APPEND EXTERNAL_PROJECT_OPTIONAL_CMAKE_CACHE_ARGS
        -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
        )
    endif()
    

    この投稿では、プロジェクトを構造化する方法を学ぶことができます:cmakeプロジェクトでサードパーティライブラリを使用する正しい方法

    mongocxx"test.cpp"のコンパイルを可能にする作業プロジェクト

    以下はCMakeLists.txtの内容です およびtest.cpp <build-dir>/Test-build/test_mongocxxという名前の実行可能ファイルをビルドできるようにします :

    • CMakeLists.txt:

      cmake_minimum_required(VERSION 3.12)
      
      set(CMAKE_CXX_STANDARD 11) 
      
      project(Test)
      
      option(${PROJECT_NAME}_SUPERBUILD "Build ${PROJECT_NAME} and the projects it depends on." ON)
      
      if(${PROJECT_NAME}_SUPERBUILD)
      
          include(ExternalProject)
      
          set(common_cmake_cache_args
              -DCMAKE_CXX_COMPILER:PATH=${CMAKE_CXX_COMPILER}
          )
          if(NOT DEFINED CMAKE_CONFIGURATION_TYPES)
              list(APPEND common_cmake_cache_args
                  -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
              )
          endif()
      
          ExternalProject_Add(libmongoc
              GIT_REPOSITORY  "https://github.com/mongodb/mongo-c-driver.git"
              GIT_TAG         "1.12.0"
              GIT_PROGRESS    1
              GIT_SHALLOW     1
              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}
                  -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/libmongoc-install
                  -DENABLE_TESTS:BOOL=OFF
                  -DENABLE_STATIC:BOOL=OFF
                  -DENABLE_EXAMPLES:BOOL=OFF
                  -DENABLE_EXTRA_ALIGNMENT:BOOL=OFF
              #INSTALL_COMMAND ""
          )
          set(libmongoc-1.0_DIR "${CMAKE_BINARY_DIR}/libmongoc-install/lib/cmake/libmongoc-1.0/")
          set(libbson-1.0_DIR "${CMAKE_BINARY_DIR}/libmongoc-install/lib/cmake/libbson-1.0/")
      
          ExternalProject_Add(libmongocxx
              GIT_REPOSITORY  "https://github.com/mongodb/mongo-cxx-driver.git"
              GIT_TAG         "r3.3.1"
              GIT_PROGRESS    1
              GIT_SHALLOW     1
              SOURCE_DIR      "${CMAKE_BINARY_DIR}/libmongocxx"
              BINARY_DIR      "${CMAKE_BINARY_DIR}/libmongocxx-build"
              INSTALL_DIR     "${CMAKE_BINARY_DIR}/libmongocxx-install"
              CMAKE_CACHE_ARGS
                  ${common_cmake_cache_args}
                  -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/libmongocxx-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
          )
          set(libmongocxx_DIR "${CMAKE_BINARY_DIR}/libmongocxx-install/lib/cmake/libmongocxx-3.3.1/")
          set(libbsoncxx_DIR "${CMAKE_BINARY_DIR}/libmongocxx-install//lib/cmake/libbsoncxx-3.3.1/")
      
      
          function(ExternalProject_AlwaysConfigure proj)
            # This custom external project step forces the configure and later
            # steps to run.
            _ep_get_step_stampfile(${proj} "configure" stampfile)
            ExternalProject_Add_Step(${proj} forceconfigure
              COMMAND ${CMAKE_COMMAND} -E remove ${stampfile}
              COMMENT "Forcing configure step for '${proj}'"
              DEPENDEES build
              ALWAYS 1
              )
          endfunction()
      
          ExternalProject_Add(${PROJECT_NAME}
              SOURCE_DIR "${CMAKE_SOURCE_DIR}"
              BINARY_DIR "${CMAKE_BINARY_DIR}/${PROJECT_NAME}-build"
              DOWNLOAD_COMMAND ""
              UPDATE_COMMAND ""
              CMAKE_CACHE_ARGS
                  ${common_cmake_cache_args}
                  -D${PROJECT_NAME}_SUPERBUILD:BOOL=OFF
                  -Dlibbsoncxx_DIR:PATH=${libbsoncxx_DIR}
                  -Dlibmongocxx_DIR:PATH=${libmongocxx_DIR}
              INSTALL_COMMAND ""
              DEPENDS
                  libmongocxx
          )
          ExternalProject_AlwaysConfigure(${PROJECT_NAME})
          return()
      endif()
      
      message(STATUS "Configuring inner-build")
      
      find_package(libmongocxx REQUIRED)
      
      add_executable(test_mongocxx test.cpp)
      target_link_libraries(test_mongocxx PUBLIC ${LIBMONGOCXX_LIBRARIES})
      target_include_directories(test_mongocxx PUBLIC ${LIBMONGOCXX_INCLUDE_DIRS})
      target_compile_definitions(test_mongocxx PUBLIC ${LIBMONGOCXX_DEFINITIONS})
      
    • test.cpp(https://mongodb.github.io/mongo-cxx-driver/mongocxx-v3/installation/#step-6-test-your-installationからコピー):

      #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. created_atフィールドとupdated_atフィールドをマングーススキーマに追加します

    2. node.js&express-アプリケーション構造のグローバルモジュールとベストプラクティス

    3. MongoDBフィールド名で許可されていない文字は何ですか?

    4. 2つの異なるフィールド間の範囲に特定の数値が含まれているデータを選択します