mongodb c++ driver(windows 64)をビルド/インストールする。
目標
MongoDB C++ Driverをインストールして、C++からMongoDBを操作できるようにする。
公式ガイドはこちら。
日本語で参考にしたのはこちら。
環境
- Windows 10
- Visual Studio 2015 Express
日本語で参考にした記事にはVS2017を使ったとあるが、後述するようにVS2017ではビルドできなかったので、VS2015を使う。
準備
Visual C++ 2015をインストール
CMakeをインストール
VS用のMakefileを作成するために使用する。
Boostをインストール
MongoDB C++ DriverではC++17の機能を使用するため、対応していないコンパイラではC++17ポリフィルが必要になる。公式ガイドによると、MSVCではBoostが唯一の道だとある。Boost C++ Librariesは基本的にソースコードだけでいいはずだが、プリコンパイル版もあるので、そちらを使うことにする。
上記サイトから、最新版のboost_x_y_z-msvc-14.0-64.exe
をダウンロードして、インストールしておく。デフォルトのままインストールすれば、C:/local/boost_x_y_x
にインストールされる。
MongoDB C DriverとBSON libraryをインストールする。
2種類入れるような書き方だが、操作自体は単一。できあがるDLLが2つになるイメージ。
公式ガイドはこちら。
ダウンロードサイトはこちら。
日本語で参考にしたのはこちら。
ダウンロードした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リンクからをダウンロードして展開する。
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だけ違うレコードが複数表示される。
MongoDBクライアントCompassで見るとご覧の通り。