gRPC(C++)をVisualStudioでビルド~HelloWorldまでやってみた

巷で流行りのgRPCに入門してみました。

C++C#で通信してみよー!ということで、まずは

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のビルドまでで上記記事と違う感じにした部分を上げていきます。

  1. gRPCリポジトリをZipでなくでGit Clone(Source Tree)で落とした
    →落とした後にタグからv1.2.xをチェックアウトします
     こちらだとProtoも一緒に落ちてくるので色々面倒くさくなくて良いです
  2. 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ですね。

 

上記リポジトリを落としてきて、

  1. lib_debug.props/lib_release.propsを編集
    →<AdditionalIncludeDirectories>の値を自分の環境のgrpcとprotoのヘッダファイルがある場所にそれぞれ変更
    →<AdditionalLibraryDirectories>の値を自分の環境のgrpcとprotoのlibファイルがある場所にそれぞれ変更
  2. test_protoc.batを編集
    →protoc_pathを自分の環境のprotoc.exeがある場所に変更
    →grpc_protoc_plugins_pathを自分の環境のgrpc_cpp_plugin.exeがある場所に変更
  3. 編集したtest_protoc.batを実行
    →srcフォルダに以下4つのファイルができていればOK
    helloworld.grpc.pb.cc
    helloworld.grpc.pb.h
    helloworld.pb.cc
    helloworld.pb.h
  4. ビルド→実行

上記手順を行えば実行できました。素晴らしい...。

デフォルトx64しかない気がした(?)ので、

x86ビルドしたい場合はソリューション構成から追加してください。

 

上記プロジェクトでなくて自分でプロジェクト作成からやる場合、

結局はpropsの設定とopensslとzlibを落とせばOKです。

  1. プロジェクト作成してソースやらを入れる
  2. nugetでopensslとzlibをインストール
    grpc.dependencies.opensslで検索すると出てくるので、
     grpc.dependencies.openssl.1.0.204.1をインストールします
     そうすると他の3つも同時に落ちてきます。
    →もしくはgrpcビルド時にnugetで落としたものにパスを通しても良いと思います
  3. プリプロセッサ定義に_WIN32_WINNT=0x0600;を追加
    →これがないとビルドエラーになります。0x600は本当は環境に合わせて変更したほうが良いかも?

    WINVER, _WIN32_WINNT の設定値 - Qiita

  4. includeパス設定
    →grpcとprotoのヘッダーへのパスを追加します
  5. linkパス設定
    →grpcとprotoのライブラリへのパスを追加します
  6. 追加のライブラリ設定
    →以下を追加します
    ・libprotobufd.lib(releaseではdがないので注意)
    ・grpc++.lib
    ・grpc.lib
    ・gpr.lib
    ・ws2_32.lib
  7. ランタイムライブラリ設定変更
    →MTに変更(デバッグはMTd)
  8. protoのコンバート
    https://github.com/grpc/grpc/tree/master/examples/cpp/helloworld
     ↑にコマンド載ってるのでそれでコンバートしてください
     上記に書いてある通り4ファイルできればOKです
  9. ビルド→実行

とりあえずここまでで自分の環境だと実行できました。

 

C++サーバーとC#クライアントで通信

上記まででC++のserverをビルドできていれば、それを立ち上げた状態で

C#のhello_worldのクライアントを動かすと「Greeting:Hello you」と出てきて成功します。

 

C#のクライアントのビルドですが・・・はい。

exampleのGreeter.slnを開いて実行するだけで動きます。

C++での苦労はなんだったのか・・・と思うくらい簡単に動きます。

 

おわりに

hello_worldがとりあえず動いたので、これからはその他のサンプルを見たり、

適当なアプリを作っていけるかと思います。

次はきっとProtoの文法を覚えていくのが良いんでしょうか・・・?

色々作りながら覚えていかないとなーという感じです。