gRPC(C++)をVisualStudioでビルド~HelloWorldまでやってみた
巷で流行りのgRPCに入門してみました。
hello_worldくらい適当に動かして・・・と思って実際やってみたんですが、
C++(VisualStudio)はhello_world動かすだけで大変だったのでメモ。
grpcとprotocのビルドまで
日本語では↓の記事が最高です。
gRPC 1.2.3をVisual Studio C++(2015)でビルドする - Qiita
更新日時も4/27と近いのでこれは勝ったなと思ったのですが、
これgRPCのビルド手順までなんですよねー。
hello_worldはvcprojも無いのでそこからも大変でした。orz
あと、↑の通りgRPC1.2.3でビルドすればよかったんですが、
gRPCのGitHubに行くと1.3.1まで出ていたので、
欲を出してそちらで通そうとしてしまったのも失敗しました。
1.3.xはgrpc.slnに含まれるaresとgrpc++_error_detailsあたりがエラーで通りません。
とりあえず通すだけなら2つのプロジェクトをアンロードすれば通ったので、
それでも良いかもしませんが、なんか気持ち悪いので自分は1.2.xでビルドしました。
(1.2.3と1.2.5で通ることを確認しました。win7,win10でそれぞれ確認)
でgRPCのビルドまでで上記記事と違う感じにした部分を上げていきます。
- gRPCリポジトリをZipでなくでGit Clone(Source Tree)で落とした
→落とした後にタグからv1.2.xをチェックアウトします
こちらだとProtoも一緒に落ちてくるので色々面倒くさくなくて良いです - gRPCのビルド時のエラーで追加をしなくても通った(1.2.5/win10のみ確認)
→上記記事だとgpr_mpscq_initといくつかのものをdefに足したとありましたが、
こちらでは足さなくてもhello_worldは動きました
(もしかしたらもっと複雑なものを作るときには必要なのかも)
くらいでしょうか・・・。もちろん記事のまままでも通ると思います。
CMakeの使い方も図付きで載っていたのでとても助かりました。
hello_worldのビルド
で、ここからが本番。hello_worldを通します。
と、色々書きそうな雰囲気を醸し出してますが、こちらもGitHubに
超スバラシイものが上がっていたのでペタリしておきます。
GitHub - jozefizso/grpc-windows: Build gRPC on Windows x64
設定がpropsファイルにまとめられているのがGoodですね。
上記リポジトリを落としてきて、
- lib_debug.props/lib_release.propsを編集
→<AdditionalIncludeDirectories>の値を自分の環境のgrpcとprotoのヘッダファイルがある場所にそれぞれ変更
→<AdditionalLibraryDirectories>の値を自分の環境のgrpcとprotoのlibファイルがある場所にそれぞれ変更 - test_protoc.batを編集
→protoc_pathを自分の環境のprotoc.exeがある場所に変更
→grpc_protoc_plugins_pathを自分の環境のgrpc_cpp_plugin.exeがある場所に変更 - 編集したtest_protoc.batを実行
→srcフォルダに以下4つのファイルができていればOK
helloworld.grpc.pb.cc
helloworld.grpc.pb.h
helloworld.pb.cc
helloworld.pb.h - ビルド→実行
上記手順を行えば実行できました。素晴らしい...。
デフォルトx64しかない気がした(?)ので、
x86ビルドしたい場合はソリューション構成から追加してください。
上記プロジェクトでなくて自分でプロジェクト作成からやる場合、
結局はpropsの設定とopensslとzlibを落とせばOKです。
- プロジェクト作成してソースやらを入れる
- nugetでopensslとzlibをインストール
→grpc.dependencies.opensslで検索すると出てくるので、
grpc.dependencies.openssl.1.0.204.1をインストールします
そうすると他の3つも同時に落ちてきます。
→もしくはgrpcビルド時にnugetで落としたものにパスを通しても良いと思います - プリプロセッサ定義に_WIN32_WINNT=0x0600;を追加
→これがないとビルドエラーになります。0x600は本当は環境に合わせて変更したほうが良いかも?
- includeパス設定
→grpcとprotoのヘッダーへのパスを追加します - linkパス設定
→grpcとprotoのライブラリへのパスを追加します - 追加のライブラリ設定
→以下を追加します
・libprotobufd.lib(releaseではdがないので注意)
・grpc++.lib
・grpc.lib
・gpr.lib
・ws2_32.lib - ランタイムライブラリ設定変更
→MTに変更(デバッグはMTd) - protoのコンバート
→https://github.com/grpc/grpc/tree/master/examples/cpp/helloworld
↑にコマンド載ってるのでそれでコンバートしてください
上記に書いてある通り4ファイルできればOKです - ビルド→実行
とりあえずここまでで自分の環境だと実行できました。
C++サーバーとC#クライアントで通信
上記まででC++のserverをビルドできていれば、それを立ち上げた状態で
C#のhello_worldのクライアントを動かすと「Greeting:Hello you」と出てきて成功します。
C#のクライアントのビルドですが・・・はい。
exampleのGreeter.slnを開いて実行するだけで動きます。
C++での苦労はなんだったのか・・・と思うくらい簡単に動きます。
おわりに
hello_worldがとりあえず動いたので、これからはその他のサンプルを見たり、
適当なアプリを作っていけるかと思います。
次はきっとProtoの文法を覚えていくのが良いんでしょうか・・・?
色々作りながら覚えていかないとなーという感じです。