目錄
無論通過哪種語言調用gRPC,都必須要編譯gRPC,因為生成proto訪問類時,除了產生標准的數據定義類之外,還需要產生客戶端代理類。客戶端代理類必須由gRPC的各個語言的protoc插件來完成。而這些插件需要在gRPC編譯后才能編譯生成。
下面我們一步步的來說明如何得到gRPC。
獲取gRPC源碼
gRPC是開源框架,項目代碼在github上,所以首先要安裝github。
github安裝后,在指定文件夾中,執行git命令就可以獲取gRPC的所有源碼。
git clone https://github.com/grpc/grpc.git
雖然在github的gRPC主頁上提供了源代碼打包下載,但是gRPC的依賴組件就無法自動獲取了。
獲取gRPC的依賴組件
正如所有的項目一樣,gRPC也是需要依賴第三方庫。由於在gRPC中已經通過git的.gitmodules
文件定義了依賴組件,所以只需執行git命令就可以自動獲取所有的依賴組件。
git submodule init
編譯gRPC
由於對其他編譯工具不熟,我暫時用vs2013編譯。編譯過程出現的問題很多。
編譯gpr,通過
編譯grpc,出現錯誤 illegal use of this type as an expression
我查找網上的資源,原來是C語言的不允許隨時定義變量,所有定義的變量都只能放在函數開頭,這也是C和C++的重要區別。
將原來的
static grpc_lb_policy *create_pick_first(grpc_lb_policy_factory *factory,
grpc_lb_policy_args *args) {
if (args->num_subchannels == 0) return NULL;
pick_first_lb_policy* p = gpr_malloc(sizeof(*p));
memset(p, 0, sizeof(*p));
改為:
static pick_first_lb_policy *p;
static grpc_lb_policy *create_pick_first(grpc_lb_policy_factory *factory,
grpc_lb_policy_args *args) {
if (args->num_subchannels == 0) return NULL;
p = gpr_malloc(sizeof(*p));
memset(p, 0, sizeof(*p));
就編譯通過了
編譯boringssl,出現很多錯誤
主要是
1>D:\Projects_Framework\grpc\vsprojects\..\src\boringssl\err_data.c(17): fatal error C1083: Cannot open include file: 'openssl/base.h': No such file or directory`
我做了三種嘗試
- 使用grpc的boringssl項目
問題:找不到openssl的頭文件,解決:在boringssl的vs項目中添加third_party的boringssl的頭文件引用
問題:D:\Projects_Framework\grpc\vsprojects\..\third_party\boringssl\crypto\asn1\t_pkey.c': No such file or directory
問題:有很多重定義。解決:在頭文件引用中去掉openssl的package依賴,原因可能是openssl的package和third_party的openssl重復
但是仍然無法編譯通過
- 不使用grpc的boringssl項目,而直接使用cmake生成boringssl的vsproj。
需要perl、go、yasm支持
perl安裝即可
golang安裝即可
yasm是一個可執行的exe,沒有安裝,在cmake中點擊advanced,在CMAKE_ASM_NASM_COMPILER中設置路徑。
但是我看在boringssl的文檔里,說boringssl不能在windows的visual studio編譯。只能用ninja編譯。
但有考慮gRPC的vs項目中boringssl不僅僅是boringssl原始的項目文件,還有一個gRPC自己添加的文件,即使編譯通過,也無法再grpc使用,所以就沒具體沒嘗試ninja方法。
- 使用grpc的boringssl里面的py腳本
我在grpc的文件夾中發現了一個文件:src\boringssl\gen_build_yaml.py
。不知道是做什么的,安裝python運行這個腳本之后,生成了很多asm文件。無法生成編譯結果。
經過很多嘗試也沒有編譯成功boringssl,在gRPC的github留言板上也有人說boringssl編譯不過。如果哪位朋友成功編譯,請告訴我方法,不勝感激。
編譯zlib
在gRPC的vs解決方案中還有一個z項目,包含了zlib依賴庫,直接通過vs也編譯不過。但我發現這個z項目全是zlib的文件,沒有額外的文件,所以我就在gRPC的文件夾的third_party\zlib
目錄下單獨編譯zlib。
通過cmake生成zlib的vcproj項目,在vs中編譯通過。
編譯grpc_dll等其他項目均通過
至此,gRPC的核心組件除了boringssl全部編譯通過。我擔心在使用C++調用gRPC的時候由於缺少boringssl會造成編譯不過,但是觀察gRPC的C++ example,只是依賴了openssl,並沒有依賴boringssl,具體的配置參考我的文章《C++調用gRPC》。
編譯protobuffer
gRPC依賴protobuffer進行消息編碼,因此需要依賴protobuffer。
protobuffer的編譯方法在文檔 third_party\protobuf\cmake\readme.md
使用cmake生成vs的解決方案protobuf.sln,編譯通過。
編譯protoc的gRPC插件
將protobuf的release文件夾拷貝到third_party\protobuf\cmake中
打開grpc_protoc_plugins.sln,編譯所有項目,順利通過。
生成protoc所有的gRPC插件
grpc_cpp_plugin.exe
grpc_csharp_plugin.exe
grpc_objective_c_plugin.exe
grpc_python_plugin.exe
grpc_ruby_plugin.exe
下面的文章會介紹如何使用這些插件。