(os: ubuntu 16.04)
1. 下載下傳gRPC源碼
1.1 git拉取
在網絡可以連接配接到github的情況下, 隻需要簡單的一條指令就可以拉取到所有需要的源碼
git clone --recurse-submodules -b v1.37.1 https://github.com/grpc/grpc
但是, 網絡無法很順暢的連接配接到github, 将拉取位址中的github.com替換成鏡像站的網址 github.com.cnpmjs.org,如果此鏡像站出現問題請重新搜尋可用的鏡像站位址。
1.2 submodule拉取
注意下面的git指令, 使用了--recurse-submodules, 會同時拉取該git項目依賴的submodule,
git clone --recurse-submodules -b v1.37.1 https://github.com/grpc/grpc
如果網絡不佳,我們可手動替換了上面指令中的拉取位址, 如下所示
git clone --recurse-submodules -b v1.37.1 https://github.com.cnpmjs.org/grpc/grpc
但是此時submodule中的位址仍然是github.com, 沒有經過替換, 是以此時拉取仍然會失敗, 經過
網上檢索到的資訊, 提供一個解決方案, 先不拉取submodule, 使用如下的git指令
git clone -b v1.37.1 https://github.com.cnpmjs.org/grpc/grpc
成功拉取到代碼後, 進入代碼目錄, 打開.gitmodules修改submodule位址, 替換所有github.com為 鏡像位址(github.com.cnpmjs.org). 然後執行git submodule sync, 重新同步submodule的url.
上述操作成功之後執行以下指令
git submodule update --init
拉取submodule, 一切順利的話gRPC相關的源碼即全部拉取成功.
2. 編譯gRPC代碼
2.1 基礎工具
2.1.1 cmake
截至(2021.5.19)官方文檔要求需要cmake版本高于3.13. 可通過一下指令檢視自己目前cmake的版本
cmake --version
如果不符合要求, 需要進行更新替換符合要求的版本, 此處不詳細叙述如何更新cmake,提供一個供
參考的網址(https://askubuntu.com/questions/829310/how-to-upgrade-cmake-in-ubuntu).
下載下傳cmake高版本:https://github.com/Kitware/CMake/releases/download/v3.20.2/cmake-3.20.2.tar.gz 後編譯預設安裝即可。
2.1.2 其他相關工具
執行以下指令就可以完成其他所需工具的安裝
sudo apt install -y build-essential autoconf libtool pkg-config
必須確定這些工具安裝成功,尤其是pkg-config ,否則後續編譯案例 helloword 會出錯。
2.2 開始編譯
2.2.1 編譯gRPC
為了友善後續操作, 先切換到超級使用者然後進行操作, 執行以下指令切換到超級使用者
sudo su
之後輸入密碼, 當@前面的符号顯示為root之後說明成功切換到超級使用者.
進入grpc代碼目錄
1、在目前目錄執行make, 編譯gRPC,再執行make install 進行預設安裝
2、再進入third_party/protobuf 下執行./configure 生成makefile 後繼續執行make 再次make install 預設安裝即可。(這一步至關重要,将protobuf可執行程式,靜動态庫以及頭檔案安裝到預設目錄,保證編譯example順利進行)
2.2 測試程式檢查
進入grpc代碼目錄, 進入helloworld測試程式目錄,
cd examples/cpp/helloworld
進入到該目錄下, 執行下面指令使用cmake 生成makefile
成功之後進行 make 編譯, 目前目錄會生成相應的服務端和用戶端可執行程式
首先啟動 greeter_server 程序, 然後另開一個終端啟動 greeter_client,
當螢幕上出現 "Greeter received: Hello world" 說明成功
2.3 利用protobuf生成c++代碼
protoc [proto file path] --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` --grpc_out=[output fold path]
protoc [proto file path] --cpp_out= [output fold path]