mongodb c++ driver(windows 64)をビルド/インストールする。

目標

MongoDB C++ Driverをインストールして、C++からMongoDBを操作できるようにする。

公式ガイドはこちら。

mongocxx.org

日本語で参考にしたのはこちら。

qiita.com

環境

日本語で参考にした記事にはVS2017を使ったとあるが、後述するようにVS2017ではビルドできなかったので、VS2015を使う。

準備

Visual C++ 2015をインストール

visualstudio.microsoft.com

CMakeをインストール

VS用のMakefileを作成するために使用する。

cmake.org

Boostをインストール

MongoDB C++ DriverではC++17の機能を使用するため、対応していないコンパイラではC++17ポリフィルが必要になる。公式ガイドによると、MSVCではBoostが唯一の道だとある。Boost C++ Librariesは基本的にソースコードだけでいいはずだが、プリコンパイル版もあるので、そちらを使うことにする。

sourceforge.net

上記サイトから、最新版のboost_x_y_z-msvc-14.0-64.exeをダウンロードして、インストールしておく。デフォルトのままインストールすれば、C:/local/boost_x_y_xにインストールされる。

MongoDB C DriverとBSON libraryをインストールする。

2種類入れるような書き方だが、操作自体は単一。できあがるDLLが2つになるイメージ。

公式ガイドはこちら。

mongoc.org

ダウンロードサイトはこちら。

github.com

日本語で参考にしたのはこちら。

qiita.com

ダウンロードしたtar.gzファイルを、ここではC:¥tmp以下に展開する。 (Source codeリンクからダウンロードしたものは、中身は似ているが、cmakeでエラーとなってしまうので、必ずmongo-c-driver-x.y.z.tar.gzのリンクからダウンロードするように)

Visual Studio 2015のx64 Native Toolsコマンドプロンプトを起動して、以下のように進める。

cd /d C:\tmp\mongo-c-driver-1.15.1
mkdir cmake-build
cd cmake-build
"C:\Program Files\CMake\bin\cmake.exe" -G "Visual Studio 14 2015 Win64" "-DCMAKE_INSTALL_PREFIX=C:\mongo-c-driver" "-DCMAKE_PREFIX_PATH=C:\mongo-c-driver" ..

最後の .. が非常に重要なので、忘れないようにする。 C:\mongo-c-driverの部分は任意で変えられる。インストール先を変えたい場合は変更する。

  • 追記2020-1-15

このままだとデバッグビルドになる。リリースビルドにしたい場合は、以下のオプションを追加する。

-DCMAKE_BUILD_TYPE=Release

続いてビルドする。

msbuild.exe /p:Configuration=RelWithDebInfo ALL_BUILD.vcxproj

大量の警告が出てもエラーが0なら問題ない(と思う)。 続いてインストールする。インストールは、バイナリ(DLL)、インクルードファイル(ヘッダファイル)、ライブラリファイルを環境に配置する作業。

msbuild.exe INSTALL.vcxproj

これでC:\mongo-c-driverにMongoDB C Driverがインストールされた。

MongoDB C++ Driverをインストールする。

インストールの方法は、ほぼC Driverと同じ。下記リンクから最新版のSource codeリンクからをダウンロードして展開する。

github.com

Visual Studio 2015のx64 Native Toolsコマンドプロンプトを起動して、以下のように進める。

cd /d C:\tmp\mongo-cxx-driver-r3.4.0\build
"C:\Program Files\CMake\bin\cmake.exe" -G "Visual Studio 14 2015 Win64" -DCMAKE_INSTALL_PREFIX=C:\mongo-cxx-driver -DCMAKE_PREFIX_PATH=C:\mongo-c-driver -DBOOST_ROOT=C:\local\boost_1_71_0 ..

C Driverインストール時にC:\mongo-c-driverを変更していたら、こちらでもそれに対応しておくこと。 また、C:\mongo-cxx-driverの部分は任意で変更可能。 実行すると、最終行で-- Build files have been written to: C:/tmp/mongo-cxx-driver-r3.4.0/buildのような出力が表示されるはず。

  • 追記2020-1-15

こちらも同様。このままだとデバッグビルドになる。リリースビルドにしたい場合は、以下のオプションを追加する。

-DCMAKE_BUILD_TYPE=Release

続いてビルド、インストールする。

msbuild.exe ALL_BUILD.vcxproj
msbuild.exe INSTALL.vcxproj

VS2017

Visual Studio 2017で一連の作業を進めたところ、C++ Driverのビルドmsbuild.exe ALL_BUILD.vcxprojでエラーが出力されて、全く進めなくなった。ENABLE_EXTENDED_ALIGNED_STORAGEに関するエラーが出ているが、Boostをやめてもムダで、結局VS2015を使ってみたらエラーが出なくなった。バイナリさえできてしまえば、あとはVS2017で開発できるが、この疑問は解消されないまま。まあ、公式ガイドにVS2017のことは書いていないので、正しいといえば正しいのかな。

初めてのMongoDB C++によるレコードの作成。

私のC++開発環境はQt Creatorなので、Qt寄りで説明する。

公式ガイドのサンプルコードをアレンジして、次のようなコードを作成する。

#include <iostream>

#include <bsoncxx/builder/stream/document.hpp>
#include <bsoncxx/json.hpp>

#include <mongocxx/client.hpp>
#include <mongocxx/instance.hpp>

int main(int, char**) {
  try {
    mongocxx::instance inst{};
    mongocxx::client conn{mongocxx::uri{}};

    bsoncxx::builder::stream::document document{};

    auto collection = conn["mydb"]["mycollection"];
    document << "say" << "Hello, MongoDB C++ Driver!";

    collection.insert_one(document.view());
    auto cursor = collection.find({});

    for (auto&& doc : cursor) {
        std::cout << bsoncxx::to_json(doc) << std::endl;
    }
  }
  catch (std::exception &ex) {
    std::cerr << ex.what() << std::endl;
  }
}

mongocxx::uri{}のところで接続したいMongoDBへのURIを書くが、ローカルに接続したいときは空で構わない。

Qtプロジェクトファイルには、インクルードパスとライブラリパスを定義しておく。Boostにもインクルードパスを通す。

INCLUDEPATH += C:/mongo-cxx-driver/include/bsoncxx/v_noabi C:/mongo-cxx-driver/include/mongocxx/v_noabi C:/local/boost_1_71_0
LIBS += -LC:/mongo-cxx-driver/lib -lmongocxx -lbsoncxx

実行時のPATH環境変数には、C++ DriverとC DriverのDLLがあるbinパスを通しておく。C++のDLLがCのDLLを参照しているため。

...;C:\mongo-cxx-driver\bin;C:\mongo-c-driver\bin

実行すると、次のように書き込まれたレコードが表示される。何回も実行すれば、IDだけ違うレコードが複数表示される。

f:id:takahide-kondoh:20191010154833p:plain

MongoDBクライアントCompassで見るとご覧の通り。

f:id:takahide-kondoh:20191010154941p:plain