windwos grpc 編譯

此文檔是windwos grpc c++ 編譯 ,基於 vs2015 編譯完成

獲取gRPC源碼

gRPC是開源框架,項目代碼在github上,因此首先要安裝github。
github安裝後,在指定文件夾中,執行Git命令就能夠獲取gRPC的全部源碼。java

https://github.com/grpc/grpcgit clone

雖然在github的gRPC主頁上提供了源代碼打包下載,可是gRPC的依賴組件就沒法自動獲取了。node

 

獲取gRPC的依賴組件

 

正如全部的項目同樣,gRPC也是須要依賴第三方庫。因爲在gRPC中已經經過git.gitmodules文件定義了依賴組件,因此只需執行git命令就能夠自動獲取全部的依賴組件。python

 

 cd grpc
git submodule update --init
 
(第三方庫目錄在third_party下面)

 

 

vs工程調試

 

用vs2015打開c++

vsprojects/grpc.slngit

1,刪除工程boringsslgithub

2,在\grpc\third_party\zlib\gzguts.hruby

中將服務器

 

 

[cpp]  view plain  copy
 
  1. #ifdef _WIN32  
  2. #  include <stddef.h>  
  3. #endif  

改爲

 

 

[cpp]  view plain  copy
 
  1. #ifdef _WIN32  
  2. #  include <stddef.h>  
  3. #pragma warning(disable:4996)  
  4. #endif  

去掉警告。

 

完成:能夠編譯框架

說明:NuGet有還原庫,須要等待完成async

 

編譯protobuffer

 

gRPC依賴protobuffer進行消息編碼,所以須要依賴protobuffer。(詳細見:grpc\third_party\protobuf\cmake\README.md)

須要git,cmake支持

cmd打開vs命令行工具(Windows Desktop Command Prompts/VS2015 x64 x86 兼容工具命令提示符)

cd 到grpc目錄

 

[cpp]  view plain  copy
 
  1. cd protobuf  
[cpp]  view plain  copy
 
  1. git clone -b release-1.7.0 https://github.com/google/googlemock.git gmock  
[cpp]  view plain  copy
 
  1. cd gmock  
[cpp]  view plain  copy
 
  1. git clone -b release-1.7.0 https://github.com/google/googletest.git gtest  
[cpp]  view plain  copy
 
  1. cd ..\cmake  
[cpp]  view plain  copy
 
  1. mkdir build & cd build  
[cpp]  view plain  copy
 
  1. mkdir release & cd release  
[cpp]  view plain  copy
 
  1. cmake -G "NMake Makefiles" ^  
  2.      -DCMAKE_BUILD_TYPE=Release ^  
  3.      -DCMAKE_INSTALL_PREFIX=../../../../install ^  
  4.      ../..  
[cpp]  view plain  copy
 
  1. cd ..  
[cpp]  view plain  copy
 
  1. mkdir debug & cd debug  
[cpp]  view plain  copy
 
  1. cmake -G "NMake Makefiles" ^  
  2.      -DCMAKE_BUILD_TYPE=Debug ^  
  3.      -DCMAKE_INSTALL_PREFIX=../../../../install ^  
  4.      ../..  
[cpp]  view plain  copy
 
  1. cd ..  
[cpp]  view plain  copy
 
  1. mkdir solution & cd solution  
[cpp]  view plain  copy
 
  1. cmake -G "Visual Studio 14 2015 Win64" ^  
  2.      -DCMAKE_INSTALL_PREFIX=../../../../install ^  
  3.      ../..  
打開grpc\third_party\protobuf\cmake\build\solution下protobuf.sln
編譯成功
生成文件:
protoc.exe
libprotobuf.lib
libprotoc.lib

後續有用到

將編譯好的Debug,Release文件夾拷貝到grpc\third_party\protobuf\cmake\目錄下(Debug下面的lib文件後邊的d須要去掉)

打開grpc\vsprojects\grpc_protoc_plugins.sln編譯生成可執行文件

完成

生成文件:

 

grpc_cpp_plugin.exe
grpc_csharp_plugin.exe
grpc_node_plugin.exe
grpc_objective_c_plugin.exe
grpc_python_plugin.exe
grpc_ruby_plugin.exe

 

 

 

c++生成helloworld服務器程序

1.定義proto

(詳細見:grpc\examples\protos\helloworld.proto)
 
syntax = "proto3";

option java_multiple_files = true;
option java_package = "io.grpc.examples.helloworld";
option java_outer_classname = "HelloWorldProto";
option objc_class_prefix = "HLW";

package helloworld;

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}
 

2. 生成訪問代碼

將proto.exe、helloworld.proto、grpc_cpp_plugin.exe拷貝到一個文件夾中,grpc_cpp_plugin.exe是gRPC的protoc插件,生成方法參考上文。

建立一個bat文件,包含如下命令:

protoc.exe -I=. --grpc_out=. --plugin=protoc-gen-grpc=.\grpc_cpp_plugin.exe helloworld.proto
protoc.exe -I=. --cpp_out=. helloworld.proto

生成了兩套文件

hellowworld.pb.h 聲明生成的消息類的頭文件
hellowworld.pb.cc  包含消息類的實現
hellowworld.grpc.pb.h 聲明你生成的服務類的頭文件
hellowworld.grpc.pb.cc 包含服務類的實現

其中前兩個是protoc生成的,後兩個是插件生成的。

 

這些包括:

  • 全部的填充,序列化和獲取咱們請求和響應消息類型的 protocol buffer 代碼
  • 名爲 Greeter的類,包含
    • 爲了客戶端去調用定義在 Greeter服務的遠程接口類型(或者 存根 )
    • 讓服務器去實現的兩個抽象接口,同時包括定義在 Greeter中的方法。

 

詳細見:https://doc.oschina.net/grpc?t=57966

生成服務器端代碼

3. 建立C++項目

依照grpc\examples\cpp\helloworld下client,server例子
greeter_async_client.cc
greeter_async_client2.cc
greeter_async_server.cc
greeter_client.cc
greeter_server.cc
 

4. 設置頭文件

將剛剛生成的文件放入工程源代碼目錄$(SolutionDir)幷包含進工程
GrpcTest\GrpcTest\src\protobuf
將:grpc\include,grpc\third_party\protobuf\src中的文件拷貝到include目錄(本身的庫目錄)
三個頭文件目錄,一個是剛生成的的訪問類路徑,一個是gRPC的頭文件,一個是protobuf的頭文件.
 

5. 設置庫

將:

grpc\third_party\protobuf\cmake\Release;
grpc\vsprojects\Release;
grpc\third_party\zlib\solution\Release;
grpc\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\lib\v120\Win32\Release\static

放入lib目錄(本身的lib庫目錄)

四個庫文件路徑:protobuf庫路徑、grpc庫路徑、zlib庫路徑、openssl庫路徑。
沒有使用boringssl,openssl的庫是從NuGet下載的package中找到的。

 

庫文件

libprotobuf.lib;
grpc.lib;
gpr.lib;
grpc++.lib;
Ws2_32.lib;

6. 編譯C++項目

將gRPC的C++ example的代碼拷貝到咱們剛建立的項目中,編譯,出現一些error:

 

錯誤A:

error C1189: #error :"Please compile grpc with _WIN32_WINNT of at least 0x600 (aka Windows Vista)"port_platform.h 59 Server_Cpp

 

解決:在項目屬性中的Preprocessor Definitions中添加_WIN32_WINNT=0x600

錯誤B:

error C4996: 'std::_Copy_impl': Function call with parameters that may be unsafe - this call relies on the caller to check ****

解決:在項目屬性中的Preprocessor Definitions中添加

_SCL_SECURE_NO_WARNINGS
_CRT_SECURE_NO_WARNINGS

錯誤C:

error LNK2038: mismatch detected for 'RuntimeLibrary': value

解決:只須要主程序和靜態庫都採用同一種Runtime Libray編譯便可。
在項目屬性C/C++中的 代碼生成 的 運行庫 選擇 Multi-threaded(/MT)

 

OpenSSl我是添加的NuGet庫來解決的

點擊項目右鍵=>管理NuGet程序包

點擊瀏覽=>輸入grpc.dependencies.openssl

找到grpc.dependencies.openssl =>點擊安裝(我是用的v1.0.204.1版本)

完成,

編輯經過

c++生成helloworld client程序

 

依照

c++生成helloworld服務器程序

流程,

 
我使用的
greeter_client.cc
greeter_server.cc
兩個測試來作的測試

 

 

說明:

附上一個編譯好的版本,裏面帶了測試程序(helloworld)

http://download.csdn.NET/detail/xie1xiao1jun/9630779

點擊打開連接

相關文章
相關標籤/搜索