A. Protocol Buffers(Objective-C)踩坑指南
這篇文章是講如何把protobuf文件的編譯工作集成到Xcode中,達到在Xcode中就像添加一般的OC文件一樣不進行任何多餘的塵沖操作直接編譯運行.proto文件判兄態的目的。
牛逼,這么智能嗎?是的,就是這么智能!
筆者的公司現在所有端都在統一使用一套protobuf數據結構,免除了多端重復定義同一套數據結構的重復工作,效率很高,非常值得推薦。並且Xcode 10進行了一些小優化來增加了對Protobuf的支持,相信不久以後,Xcode對Protobuf的支持將更加智能!
至於什麼是 Protobuf 和 Protobuf 語法教程,不是這篇文章的主題,請自行Google。
環境:Xcode 10+
語言:Objective-C
話不多說,正題開始:
首先,真正的企業級項目,並不只是網上很多教程裡面演示的一兩個 .proto 文件,而是一批 .proto 文件目錄的集合,並且是多端共享的。你會發現按照那些教程裡面的講的去做寫個demo或許可以,但是真正要達到企業級別的使用的時候,還遠遠不夠,你會遇到各種各樣的坑。別問我是怎麼知道的,我都是靠自己一個個踩出來的。
首先,要能編譯Protobuf文件,我們得安裝官方的編譯器。你可以選擇下面任意一種你喜歡的安裝方式:
安裝好後,在terminal中輸入 which protoc 檢測是否安裝成功,如安裝成功會返迴文件路徑: /usr/local/bin/protoc
如有問題,請自行google,不在本教程范圍內。
沒什麼好說的,新建一個Xcode工程。使用Cocoapods引入Protobuf的庫:
Pod search Protobuf
選擇最穩定的版本即可。
這里有兩種創建.proto文件的方式:
至於文件內容,如果你熟悉protobuf語法,那隨便寫幾行即可,如果不熟悉,那麼可以我的測試內容:
A.proto 文件內容:
B.proto 文件內容:
Xcode 自己並不認識 .proto文件,所以並不會自動編譯它們,我們需要把 .proto編譯器 自己集成到項目當中,集成的方式如下:
Project --> Build Rules --> 點擊+號 ,生成一個特定文件類型編譯腳本。
比如:
到此處,我們有幾個注意事項:
我們試試把 --proto_path 換成相對路徑,看會發生什麼,也就是把腳本換成
編譯運行,咦~報錯了。查看日誌,我們可以看到這么一條log信息:
翻譯過來就是在--proto_path這個參數中你必須指定.proto源文件的精確路徑, protoc 太笨了,它無法搞清楚這個相對路徑是不是我們要的絕對路徑。google的工程師說這太他么難了。所以這里很明確了, --proto_path 的參數值,只能是proto文件根目錄的絕對路徑。
我們上面說了,${INPUT_FILE_PATH} 是代表編譯輸入源文件的絕對路徑。
文檔裡面給的demo是:
protoc --proto_path=src --objc_out=build/gen src/foo.proto src/bar/baz.proto
什麼意思呢?
它說,最終掘源編譯器會把 src/foo.proto 文件編譯成: build/gen/Foo.pbobjc.h 和 build/gen/Foo.pbobjc.m 文件。
而會把 src/bar/baz.proto 文件編譯成 build/gen/bar/Baz.pbobjc.h 和 build/gen/bar/Baz.pbobjc.m 。
而不是 build/gen/Baz.pbobjc.h 和 build/gen/Baz.pbobjc.m
也就是說protobuf編譯器最終生成的文件會自動按照文件源目錄結構存放。
特別強調 並不會 自動創建 build/gen 目錄,這個目錄需要你提前建好。
並且,查看最終編譯生成的.m文件,你會發現一些有趣的事情;比如我在A.proto中引入了B.proto文件,你會看到Protobuf最終編譯出來的A.pbobjc.m文件導入文件的格式是包含文件路徑的,例如:
我們注意到,上面設置的proto文件的編譯輸出路徑是 $DERIVED_FILE_DIR , 這是為何呢?
答案是為了方便Xcode的集成。
對於自定義的編譯腳本,都需要設置一個文件的輸出路徑.
我們點腳本框下面的Output Files下面的 + 號, 指定文件輸出路徑。
因為OC文件分為.h和.m文件,所以我們指定2個。
點了之後,你會發現,xcode默認給出的是 $(DERIVED_FILE_DIR)/newOutputFile ,
我們將其改為 $(DERIVED_FILE_DIR)/${INPUT_FILE_BASE}.pbobjc.h 和 $(DERIVED_FILE_DIR)/${INPUT_FILE_BASE}.pbobjc.m ,並且在.m文件的 Compiler Flags 中指定為 -fno-objc-arc 代表該.m文件採用mrc編譯。
編譯運行,大功告成,是不可能的!!!!
你會發現又報錯了:
什麼意思呢? 其實就是在 DerivedSources 下找不到 A.pbobjc.m 文件。因為我們指定這個編譯的輸出路徑在這個目錄下,所以Xcode在進行OC文件的編譯時會去這個目錄下找,但是它找不到。為什麼找不到呢?我們去這個目錄下看,這個目錄下確實沒有 A.pbobjc.m 這個文件,但是確發現有 a/A.pbobjc.m 。原因我們已經說了,protoc最終的編譯文件會自動加上目錄前綴。
有人可能會說,能不能把輸出文件改成 $(DERIVED_FILE_DIR)/*/${INPUT_FILE_BASE}.pbobjc.h 呢?那我們就來試下。
編譯運行
what the hell?
原來,Xcode的Output Files特別蠢,它不支持類似這種通配符寫法: $(DERIVED_FILE_DIR)/*/${INPUT_FILE_BASE}.pbobjc.h 。
也不支持傳入任何的自定義變數。
只能是明確的文件路徑和Xcode自帶的環境變數,但是實際項目中,可能不只一層路徑,有可能是文件夾下嵌套文件夾。
靠,那這怎麼辦呢?
實在沒辦法了,就在打算放棄的時候,咨詢了我們的腳本大神,我們嘗試了以下在腳本末尾再加了兩行:
是不是很機智?
什麼意思呢?就是說我們cd到該目錄,然後找到該文件對應生成的oc文件,將其一份兒到根目錄。懷著求神拜佛的意志,運行了以下,Perfect,終於不再報錯了,到目錄中查看,也正是我們想要的,所有文件都被出來了。
下一步,就是正常的在項目中import和使用了。
你以為到此就沒有坑了嗎?到此還有坑。有2點需要注意:
好了,就講到這里吧,如果覺得文章看得不是很明白,需要一個demo。或者大神有更好的建議,請在評論區留言~
如果文章對你有幫助,請不要吝嗇你的點贊哦,你的支持是我分享的動力~
如果大家喜歡,有時間再講講怎麼改改AFNetworking,能直接請求後端給的 Protobuf 格式的數據~
B. 如何實現protobuf在XCODE上armv7/armv7s/i386的交叉編譯
步驟一:部署protoc.exe
1)sudo su ---進入管理模式
//以下操作切換至protobuf文件夾下
2)./configure
3)make
4)make check
5)make install
此時可以查看protobuf文件夾下面的makefile文件,可以查看-build表示的本機環境以及-host表示的編譯庫的運行環境
我本地的-build=x86_64-apple-darwin12.3.0
-host=x86_64-apple-darwin12.3.0
(這兩個參數在後續配置腳本需要用到,與後面腳步的i686-apple-darwin12.3.0以及arm-apple-darwin12.3.0後綴「arm-apple-darwin12.3.0」保持一致)
6)make distclean清理已生成的makefile,為交叉編譯配置新makefile做准備
步驟二:配置交叉編譯
1)執行腳本ios-build.sh,腳本內容如下:
configure_for_platform() {
export PLATFORM=$1
#export PLATFORM=iPhoneOS
echo "Platform is ${PLATFORM}"
if [ "$PLATFORM" == "iPhoneSimulator" ]; then
export ARCHITECTURE=i386
export ARCH=i686-apple-darwin12.3.0
fi
if [ "$PLATFORM" == "iPhoneOS" ]; then
export ARCHITECTURE=$2
export ARCH=arm-apple-darwin12.3.0
fi
export ARCH_PREFIX=$ARCH-
export SDKVER="6.1"
#sdk版本號必須正確
export
DEVROOT=/Applications/Xcode.app/Contents/Developer/Platforms/${PLATFORM}.platform/Developer
export SDKROOT="$DEVROOT/SDKs/${PLATFORM}$SDKVER.sdk"
export
PKG_CONFIG_PATH="$SDKROOT/usr/lib/pkgconfig:$DEVROOT/usr/lib/pkgconfig"
export AS="$DEVROOT/usr/bin/as"
export ASCPP="$DEVROOT/usr/bin/as"
export AR="$DEVROOT/usr/bin/ar"
export RANLIB="$DEVROOT/usr/bin/ranlib"
#export CPP="$DEVROOT/usr/bin/c++"
#export CXXCPP="$DEVROOT/usr/bin/c++"
export CC="$DEVROOT/usr/bin/gcc"
export CXX="$DEVROOT/usr/bin/g++"
export LD="$DEVROOT/usr/bin/ld"
export STRIP="$DEVROOT/usr/bin/strip"
export LIBRARY_PATH="$SDKROOT/usr/lib"
export CPPFLAGS=""
#export CFLAGS="-arch armv7 -fmessage-length=0 -pipe -fpascal-strings
-miphoneos-version-min=4.0 -isysroot=$SDKROOT -I$SDKROOT/usr/include
-I$SDKROOT/usr/include/c++/4.2.1/"
export CFLAGS="-arch ${ARCHITECTURE} -fmessage-length=0 -pipe
-fpascal-strings -miphoneos-version-min=4.0 -isysroot=$SDKROOT
-I$SDKROOT/usr/include -I$SDKROOT/usr/include/c++/4.2.1/"
export CXXFLAGS="$CFLAGS"
#export LDFLAGS="-isysroot='$SDKROOT' -L$SDKROOT/usr/lib/system
-L$SDKROOT/usr/lib/"
export LDFLAGS="-arch ${ARCHITECTURE} -isysroot='$SDKROOT'
-L$SDKROOT/usr/lib/system -L$SDKROOT/usr/lib/"
./configure --host=${ARCH} --with-protoc=protoc --enable-static
--disable-shared
}
mkdir ios-build
#build for iPhoneSimulator
configure_for_platform iPhoneSimulator
make clean
make
cp src/.libs/libprotobuf-lite.a ios-build/libprotobuf-lite-i386.a
#提取完整版本(i386)
cp src/.libs/libprotobuf.a ios-build/libprotobuf-i386.a
#build for iPhoneOS armv7
configure_for_platform iPhoneOS armv7
make clean
make
cp src/.libs/libprotobuf-lite.a ios-build/libprotobuf-lite-armv7.a
#提取完整版本(armv7)
cp src/.libs/libprotobuf.a ios-build/libprotobuf-armv7.a
#build for iPhoneOS armv7s
configure_for_platform iPhoneOS armv7s
make clean
make
cp src/.libs/libprotobuf-lite.a ios-build/libprotobuf-lite-armv7s.a
#提取完整版本(armv7s)
cp src/.libs/libprotobuf.a ios-build/libprotobuf-armv7s.a
make clean
#cerate a fat library containing all achitectures in libprotobuf-lite.a
xcrun -sdk iphoneos lipo -arch armv7 ios-build/libprotobuf-lite-armv7.a -arch
armv7s ios-build/libprotobuf-lite-armv7s.a -arch i386
ios-build/libprotobuf-lite-i386.a -create -output
ios-build/libprotobuf-lite.a
#合並三個完整版本(libprotobuf.a)
xcrun -sdk iphoneos lipo -arch armv7 ios-build/libprotobuf-armv7.a -arch
armv7s ios-build/libprotobuf-armv7s.a -arch i386 ios-build/libprotobuf-i386.a
-create -output ios-build/libprotobuf.a
2)將打包生成的libprotobuf-lite.a和libprotobuf.a復制至工程下進行編譯,可以編譯protobuf在xcode上的模擬器版本和真機版本,完成交叉編譯。
C. protobuf-net運行在Unity上,修復IL2CPP反射不兼容問題
Unity開發中,我們可能需要用到 protobuf-net 這個C#實現的ProtoBuff庫。
但是, protobuf-net 在IL2CPP下,因為反射的一個梁世不兼容問題,是會運行崩潰的,導致iOS下沒法玩。
這時候需要對 protobuf-net 稍作修改,重新編譯出DLL才能在Unity下完美運行。橡做肢
這種修改,估計很多遇到同樣問題的項目都遇過了。 分享給遇到同樣困難的人,希望有幫胡姿助。
詳細修改,放到GitHub的一個分支上了。
https://github.com/kingsoft-topgame/protobuf-net/commit/
D. protobuf 怎麼在iOS中實用
有兩種方式,一是直接使用C++版, 引用.h和dylib就可以了, 用在64位的5s上很容易,但是在5以下的32位上編譯環不容易弄對。
二是用objc版的。可以參考如下操作:
1,下載ProtocolBuffer包,並按照包中根目錄下README.txt安裝。
make install後,會生成編譯器protoc,並拷貝到/usr/local/bin目錄下。
2,下載蘆備Objective-C compiler for ProtocolBuffer。
目前有兩種類型的實現。
一個針對ProtocolBuffer2.2做修改,使最後生成的陪氏毀.proto文件編譯器(protoc)支持Objective-C類型的文件輸出。
另一個針對ProtocolBuffer2.3推出的plugin模式編寫插件,以插件方式支持Objective-C類型的文件輸出。
我選用第二種方式,這也是Google推薦的方式。
默認會在當前運行目錄下創建protobuf-objc目錄。進入該目錄,並執行:
./autogen.sh
./configure
make
make install
最終生成的插件名字為protoc-gen-objc,會被安裝到/usr/local/bin/目錄下。
3,測試.proto文件編譯。
隨便寫一個test.proto文件,並編譯該文件。命令是:
protoc –objc_out=/Output/Directory/ test.proto
protoc會自動在/usr/local/bin/目錄下尋找名為」protoc-gen-objc」的插件,並使用該插件編譯.proto文件,最終生成兩個文件:
test.pb.h
test.pb.m
這個步驟通過後,說明ProtocoBuffer Compiler for Objective-C可以正常工作了。
4,在Xcode4.3.1中使用ProtocolBuffer
將步驟2中protobuf-obj/src/runtime/Classes目錄導入到Xcode項目中,導入時,選中」Copy items into destination group『s folder(if needed)「。
導入位置選核殲擇項目根目錄。導入完畢後,項目根目錄下將會出現Classes目錄。將該目錄改名為ProtocolBuffers(注意最後的s):
mv Classes ProtocolBuffers
修改項目屬性中」Build Setting——>Header Search Pathes」,將項目根目錄「.」添加到頭文件搜索路徑中去。
這樣ProtocolBuffer for Objective-C的工作環境就配置好了。
5,使用將步驟3中編譯輸出的test.pb.h和test.pb.m添加到項目中,就可以直接使用了
E. gRPC入坑記
概要
由於gRPC主要是谷歌開發的,由於一些已知的原因,gRPC跑demo還是不那麼順利的。單獨寫這一篇,主要是gRPC安裝過程中的坑太多了,記錄下來讓大家少走彎路。
主要的坑:
本文講解gRPC demo的同時,會介紹如何解決這些坑。本文對應的Github地址:https://github.com/52fhy/grpc-sample 。該倉庫存儲了demo示例,以及部分系統編譯好的二進制包,大家覺得有些步驟里耗時實在太長了,可以直接clone該倉庫,復制二進制包到對應目錄(僅限測試開發,生產環境還是老老實實自己編譯吧)。
升級GCC
gRPC命令行工具編譯需要使用 GCC4.8及以上版本。CentOS6系列的內置版本是GCC4.7。
如果你的系統GCC版本>=4.8,可以忽略本節。如果僅使用golang、java,請忽略本節。
如果需要升級gcc至4.8或更高版本,建議直接採用安裝SCL源之後安裝devtoolset-6(devtoolset-6目前gcc版本為6.3),因為devtoolset-4及之前的版本都已經結束支持,只能通過其他方法安裝。
升級到gcc 6.3:
需要注意的是scl命令啟用只是 臨時 的,退出shell或重啟就會恢復原系統gcc版本。如果要長期使用gcc 6.3的話:
這樣退出shell重新打開就是新版的gcc了。其它版本同理。
升級到gcc 7.3:
已經停止支持的devtoolset4(gcc 5.2)及之前版本的安裝方法,可能比較慢,大家感興趣的話可以嘗試。
編譯gRPC命令行工具
gRPC分C、JAVA、GO、NodeJS版本,C版本包括C++, Python, Ruby, Objective-C, php, C#,這些語言都是基於C版本開發的,共用代碼庫一個代碼庫。
如果使用C版本的gRPC,最終要從源碼里編譯出下列工具:
這些工具作為插件供proto編譯器使用。需要先下載 grpc/grpc github上的源碼。
這里有2個坑:
1、grpc/grpc倉庫比較大,鑒於國內訪問的網速,建議使用國內鏡像。碼雲(https://gitee.com)提供了同步更新的鏡像地址:
這樣下載速度提高了不少。
2、git submole update這個命令實際就是在下載.gitmoles文件里定義的第三方依賴項到third_party目錄,這個依賴項有很多,大家可以打開.gitmoles文件查看下詳情。依賴的倉庫都在github上,下載沒幾個小時是下載不下來的,就等著慢慢下載吧。
回頭想想,我們花費了很多時間,結果只是為了得到grpc的proto編譯插件。
PHP相關支持
PHP暫時不支持作為grpc的服務端。作為客戶端是可以的,需要機器安裝:
其中protoc和protobuf c擴展已經在 Protobuf 小試牛刀 介紹過了,這里不再贅述。上一小節里如果安裝成功,那麼grpc_php_plugin也是有了的。下面介紹如何安裝PHP版的gRPC庫。
安裝grpc c擴展:
要求:GCC編譯器需要4.8及以上版本。可以使用pecl安裝:
也可以指定版本:
或者下載源碼(http://pecl.php.net/package/grpc)安裝:
grpc/grpc代碼庫里也有PHP擴展的C源碼,在grpc/src/php/ext/grpc目錄,進去也可以直接編譯。
編譯完成後在php.ini里添加,使用php --ri grpc可以查看信息。
安裝完C擴展後,還需要使用composer安裝grpc的庫:
gRPC示例
編寫gRPC proto
一共定義了三個文件:
其中 User 作為 Model定義,Response 用於 RPC統一返回定義,GreeterService 則是服務介面定義。
限於篇幅,proto文件詳見 https://github.com/52fhy/grpc-sample 倉庫的proto目錄。
GreeterService.proto文件內容如下:
這裡面定義了一個service,相當於定義了一個服務介面,我們把方法名、參數定義好了,後面需要去實現它。由於gRPC不支持PHP作為服務端,這里我們使用Golang作為服務端。
首先需要使用proto工具編譯出golang的代碼:
執行成功,會在 Pb_Go目錄里生成Go代碼:
如果需要生成PHP客戶端的代碼,則需要使用grpc php的命令行工具grpc_php_plugin,前面小結如果執行成功,這個工具已經有了。然後:
最終生成的文件:
注意:編譯那裡如果我們不加--grpc_out=../$out --plugin=protoc-gen-grpc=/usr/local/bin/grpc_php_plugin,生成的PHP類是沒有GreeterClient的。這個文件是gRPC編譯工具自動生成的,用於連接gRPC服務端。
go編寫服務
我們用Golang寫服務端。上面雖然生成了Golang的部分代碼,但真正的服務還沒有寫呢。
main.go
首先我們新建個main.go,代碼不多,我直接貼出來:
然後就可以編譯了。
有個大坑:go build main.go的時候會先下載go.mod里定義的依賴(依賴比較多,詳情查看:https://github.com/52fhy/grpc-sample/blob/master/go.mod),其中下面這條非常慢,倉庫太大了,雖然重定向到github:
為了快速下載,我在碼雲上做了鏡像,地址:gitee.com/52fhy/google-api-go-client 。改了之後下載快多了。
編譯成功後,生成了二進制文件main。我們可以直接運行:
go test
為了測試我們寫的服務是否正常,可以寫測試用例:
test_client.go
運行:
運行有點慢,感覺依賴的庫多了。
php客戶端
使用gRPC PHP客戶端,確保你已經安裝了:
示例:
client_test.php
運行後輸出:
常見問題
1、CentOS6使用 go mod獲取第三方依賴包unknown revision xxx錯誤
解決:其實go mod調用鏈中會用到一些git指令,當git版本比較舊時,調用失敗產生錯誤,並給出歧義的提示信息。方法就是升級git版本,CentOS6自帶的git是1.7版本。升級完畢後,再嘗試go mod。
快速升級方法:
centos6:
2、PHP報錯:Fatal error: Class ' not found
解決:請安裝PHP的protobuf c擴展。
3、PHP報錯:Fatal error: Class 'GrpcBaseStub' not found
解決:使用composer require grpc/grpc安裝grpc。另外對應的grpc C擴展也要安裝。
4、下載 github release包很慢怎麼辦?
解決:下載Mac版 Free Download Manager 下載工具可以解決Github 下載緩慢或失敗問題。速度嗖嗖的。
參考
1、為CentOS 6、7升級gcc至4.8、4.9、5.2、6.3、7.3等高版本
http://www.vpser.net/manage/centos-6-upgrade-gcc.html
2、centos 6.x/7.x使用yum升級git版本 - 夜空
https://blog.slogra.com/post-721.html
3、Protobuf 小試牛刀 - 飛鴻影
https://www.cnblogs.com/52fhy/p/11106670.html
(本文完)
F. protoc.exe生成java代碼一定要用命令行嗎
是的,這個是用命令來執行的,不過你可以把命令寫成windows的批處理文件 ,即.bat文件,每次雙擊即可執行。也可以使用java代碼去調用protoc.exe。做成自動化的。
G. protobuf使用出現的問題以及方法
在windows下使用protobuf,編譯成dll,在使用中提示下面錯誤( unresolved external symbol
?empty_string_once_init_@internal@protobuf@google@@3HA (int google::protobuf::internal::empty_string_once_init_),
?empty_string_@internal@protobuf@google@@3PBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@B (class std::basic_string,class std::allocator> const * const google::protobuf::internal::empty_string_)
提示這兩個函差源數,而通過用mpbin 查看libprotobufd.dll,其中導出了這兩個函數,最後在這里找到
答案
需要在引用這個dll的工程中加入宏 PROTOBUF_USE_DLLS,通過搜索protobuf工程,發現定義這個宏之後,添加這個宏之後,會有下面的宏定義:
#define LIBPROTOBUF_EXPORT__declspec(dllimport)
有可能在加入pb之後,你的工程出現數百個未定義的類型,而明顯在你的項目中,這些都斗慶弊是有定義的,這個時候,你可以考慮把pb消息的頭文件添加到其他頭文件之前
默認生空族成的xxx.pb.h,xxx.pb.cc的類在windows下都是沒有_dllexport符號修飾,所以不可以在生成的dll中導出使用,可以通過 `protoc --cpp_out=dllexport_decl=MY_EXPORT_MACRO:path/to/output/dir myproto.proto`來實現為所有的類添加`MY_EXPORT_MACRO`修飾符。然後在另外一個h文件中定義`MY_EXPORT_MACRO`宏,然後在所有的頭文件中包含它
H. Swift 安裝protobuf
1、官方項目地址: https://github.com/apple/swift-protobuf
2、拉取項目到本地
3、進入項目本地路徑,查看版本
4、根據項目需要,選擇版本編譯 如:1.5.0
5、構建項目
6、構建完成之後會生成一個 protoc-gen-swift 執行路徑:swift-protobuf/.build/release/protoc-gen-swift
7、把protoc-gen-swift文件直接拷貝到/usr/local/bin目錄下
8、swift版本的protobuf已安裝檔伏完成,現在可以來測試使喚冊用
准備一個proto文件(Book.proto)
9、生成swift文件和蠢宏
10、把生成的Book.swift文件拖入到項目中就可以使用了
I. 如何在windows下VC++使用protobuf
當前版本為2.3.0,下載兩個御裂此壓縮包:protoc-2.3.0-win32.zip和protobuf-2.3.0.zip,前者是protobuf的編譯器,後者包含了有三程序語言的開發包。
2.解壓
首先解壓protoc-2.3.0-win32.zip,把protoc.exe文件放到path路徑中,最簡單的做法就是把這個文件拷貝到C:/WINDOWS目錄下。
解壓protobuf-2.3.0.zip文件,將文件加壓到C盤根目錄,主文件位於C:/protobuf-2.3.0/protobuf-2.3.0目錄下。
3.安裝操作
(1)使用VS2005編譯proto,源悔VS工程目錄位於vsprojects目錄中,工程名字為「protobuf.sln」。
(2)選擇「生成」à「生成解決方案」選項進行編譯,編譯過程中可能會由於編譯的順序報錯誤,可以使用手工逐個順序編譯生成,可能會比較順利。按照下圖的順序,右鍵「重新生成」,逐個編譯。但是我在實習操作過程中,libprotobuf-lite工程重來都沒鎮迅有成功編譯通過過。淡定先,這個不會影響大局的。
J. 在windows環境下 編譯pb (protobuf) 文件
protoc --plugin=protoc-gen-go.exe --go_out= . xx.proto
protoc --plugin=protoc-gen-go.exe --go-grpc_out= . xx.proto
若提示: --go-grpc_out: protoc-gen-go-grpc: 系統找不到指定的文件。
需在 grpc-go-1.31.0\cmd\protoc-gen-go-grpc 進行編譯, go build即可。 把生成的protoc-gen-go-grpc.exe放到你的 GOPATH/bin 目錄下