最近grpcを触れる機会があったんですが、WindowsのC++環境作るのに結構苦労したので記事として書き残そうと思います。
gRPCとは、Googleが開発した高性能なRPC(Remote Procedure Call)フレームワークです。Protocol Buffersをデフォルトのシリアライズフォーマットとして使用し、異なるプログラミング言語間での効率的な通信を実現します。HTTP/2を基盤とし、双方向ストリーミングやフロー制御、ヘッダー圧縮などの機能をサポートしています。これにより、マイクロサービスアーキテクチャにおいて高いパフォーマンスとスケーラビリティを提供します。
Contents
環境構築手順
環境作る方法はいくつかあるようですが、一番簡単そうなvcpkgを利用したものを本記事では説明します。
VisualStudioは既にインストールされてるものとして手順には含めません。
インストール
必要な各種ツールなどをインストールします。
CMake
下記よりインストーラーのDL & インストール
vcpkg
- vcpkgのリリースページよりソースコードをDL
- 展開後、
bootstrap-vcpkg.bat
を実行する
vcpkg.exeが作成される - vcpkg.exeのパスを環境変数に追加する
set path=%path%;
grpc
下記のコマンドでインストール
vcpkg install grpc:x64-windows
protobuf
vcpkg install protobuf protobuf:x64-windows
各項目のインストールが終わったら、最後にvcpkgの統合を行います。
vcpkg integrate install
後述するprotocコンパイラのパスも環境変数へ追加しておきましょう。
set path=%path%;\packages\protobuf_x64-windows\tools\protobuf
grpcプロジェクト生成
Protocコンパイラによるコード生成
Protocol Buffersで使用するProtocコンパイラを用いてインターフェースにあたるコードを生成します。
まずは適当な空のフォルダ(project)に下図のようにbuild
, proto
, src
フォルダを作成しましょう。
grpc githubより今回使う3ファイルをフォルダへコピーします。
- examples\protos\helloworld.proto
protoフォルダへコピー - examples\cpp\helloworld\greeter_client.cc
srcフォルダへコピー - examples\cpp\helloworld\greeter_server.cc
srcフォルダへコピー
protoフォルダをカレントとして、下記コマンドを実行しインターフェースとメッセージ情報にあたるコード生成を行います。
protoc -I=. --cpp_out=. helloworld.proto
protoc -I=. --grpc_out=. --plugin=protoc-gen-grpc="\packages\grpc_x64-windows\tools\grpc\grpc_cpp_plugin.exe" helloworld.proto
protoフォルダに生成した下記の4ファイルはsrcフォルダへ持っていきましょう。
- helloworld.grpc.pb.cc
- helloworld.grpc.pb.h
- helloworld.pb.cc
- helloworld.pb.h
ちなみにxxx.grpc.pb.cc / .hファイルには通信インターフェース、xxx.pb.cc / .hファイルにはメッセージ情報が記載されているようです。
CMakeによるプロジェクト生成
projectフォルダ直下にCMakeLists.txtを作成して、中身を下記のようにします。
cmake_minimum_required( VERSION 3.1 )
project( grpc_example )
find_package(gRPC CONFIG REQUIRED)
find_package( Protobuf REQUIRED )
add_executable( server src/greeter_server.cc src/helloworld.grpc.pb.cc src/helloworld.pb.cc)
add_executable( client src/greeter_client.cc src/helloworld.grpc.pb.cc src/helloworld.pb.cc)
target_link_libraries( server PRIVATE gRPC::grpc++ gRPC::grpc++_reflection gRPC::gpr gRPC::grpc gRPC::grpc++ protobuf::libprotoc protobuf::libprotobuf protobuf::libprotobuf-lite absl::flags absl::flags_parse )
target_link_libraries( client PRIVATE gRPC::grpc++ gRPC::grpc++_reflection gRPC::gpr gRPC::grpc gRPC::grpc++ protobuf::libprotoc protobuf::libprotobuf protobuf::libprotobuf-lite absl::flags absl::flags_parse )
その後、buildフォルダをカレントとして下記のコマンドを実行し、ソリューションを作成します。
cmake -G "Visual Studio 17 2022" ../ -DCMAKE_TOOLCHAIN_FILE=/scripts/buildsystems/vcpkg.cmake
Visual Studioのバージョンは使用するものによって異なります。
各バージョンは下記の通りで、2017以下はArchitectureとしてWin64またはARMを指定します。
2022以外は試したことないので参考程度に。
Visual Studio 17 2022
Visual Studio 16 2019
Visual Studio 15 2017 [arch]
Visual Studio 14 2015 [arch]
Visual Studio 12 2013 [arch]
ソリューションなどのファイルが正常に生成できたら、ビルドコマンドを実行します。
cmake --build .
環境構築が正常にできていればbuild/Debug
フォルダに下記のexeが作成されます。
- server.exe
- client.exe
もし何らかのエラーなどが発生する場合は、僕が作成した環境がGithubにあるので参考にしてみてください。
デモ
1つのPC上でserverとclientのgreeter(挨拶)動作を見てみます。
終わりに
grpcの公式ドキュメントは結構充実してるんですが、Windows C++環境は有用な情報がなかなか見つからなかったのでまとめてみました。
今回は同じPC上のプロセスであるサーバーとクライアントで通信を行いました。
次回はHyper-Vを用いてUbuntu上にgrpc python環境を構築して、通信させてみたいと思います。
書きましたので、よければこちらもどうぞ。
参考情報
下記のページを参考に、僕の環境で合わない部分がいくつかあったので本記事では変更しています。
先人に感謝。
実施環境
Windows10
Visual Studio2022