導航:首頁 > 源碼編譯 > 為什麼生成protoc項目要重新編譯

為什麼生成protoc項目要重新編譯

發布時間:2023-05-25 11:52:22

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 目錄下

閱讀全文

與為什麼生成protoc項目要重新編譯相關的資料

熱點內容
下班之後的程序員 瀏覽:71
檢測支持ssl加密演算法 瀏覽:341
衢州發布新聞什麼APP 瀏覽:82
中國移動長沙dns伺服器地址 瀏覽:249
wifi密碼加密了怎麼破解嗎 瀏覽:596
linux命令cpu使用率 瀏覽:67
linux實用命令 瀏覽:238
傳奇引擎修改在線時間命令 瀏覽:109
php取域名中間 瀏覽:897
cad命令欄太小 瀏覽:830
php開發環境搭建eclipse 瀏覽:480
qt文件夾名稱大全 瀏覽:212
金山雲伺服器架構 瀏覽:230
安卓系統筆記本怎麼切換系統 瀏覽:618
u盤加密快2個小時還沒有搞完 瀏覽:93
小米有品商家版app叫什麼 瀏覽:94
行命令調用 瀏覽:436
菜鳥裹裹員用什麼app 瀏覽:273
窮查理寶典pdf下載 瀏覽:515
csgo您已被禁用此伺服器怎麼辦 瀏覽:398