CocoaAsyncSocket網絡通信使用之Protobuf安裝(五)
Protocol Buffers是Google推出的工具,主要用來處理數據的序列化和反序列化,能夠針對數據的不同類型做壓縮存儲,從而減少網絡數據傳輸的大小。
一般我們在寫數據協議的時候,都需要針對不同的平臺實現多次數據解析方法,而Protocol Buffers的另一個功能就是一次模版定製,多平臺編譯使用。
Protocol Buffers原生支持c++、java、python,可以在ios上使用c++版混編代碼,但是編譯過程比較麻煩,我們這裏在ios中使用第三方的庫(oc版本)。
來源地址:https://github.com/alexeyxo/protobuf-objc
安裝Protocol Buffers
1. 先檢查自己的mac上是否有安裝Homebrew。使用命令:brew -v
zhuruhongdeMacBook-Pro:ios zhuruhong$ brew -v
Homebrew 0.9.5 (git revision 30c54; last commit 2016-02-16)
2. 如果你還沒有安裝,請使用下面的命令安裝
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
3. 安裝好Homebrew後,我們接下來安裝必須的相關工具。依次執行以下命令:
brew install automake
brew install libtool
brew install protobuf
注意:我之前安裝過protobuf,中間出了以下錯誤。告訴我not linked,處理過程如下:
zhuruhongdeMacBook-Pro:protobuf-objc zhuruhong$ brew install protobuf
Warning: protobuf-2.6.1 already installed, it's just not linked
zhuruhongdeMacBook-Pro:protobuf-objc zhuruhong$
zhuruhongdeMacBook-Pro:protobuf-objc zhuruhong$ brew link protobuf
Linking /usr/local/Cellar/protobuf/2.6.1...
Error: Could not symlink include/google/protobuf/compiler/code_generator.h
Target /usr/local/include/google/protobuf/compiler/code_generator.h
already exists. You may want to remove it:
rm '/usr/local/include/google/protobuf/compiler/code_generator.h'
To force the link and overwrite all conflicting files:
brew link --overwrite protobuf
To list all files that would be deleted:
brew link --overwrite --dry-run protobuf
zhuruhongdeMacBook-Pro:protobuf-objc zhuruhong$
zhuruhongdeMacBook-Pro:protobuf-objc zhuruhong$ brew link --overwrite protobuf
Linking /usr/local/Cellar/protobuf/2.6.1... 70 symlinks created
zhuruhongdeMacBook-Pro:protobuf-objc zhuruhong$
其中brew link --overwrite protobuf命令可能失敗,應該沒有權限覆蓋對應的protocol目錄中的文件權限,請逐個修改後,重試命令。
4. 爲了能夠在任意目錄使用protoc命令,我們爲protoc創建一個快捷鏈接。當然這個是可選的,你可以自己配置環境變量也能達到同樣的效果。以下是鏈接命令:
ln -s /usr/local/Cellar/protobuf/2.6.1/bin/protoc /usr/local/bin
5. 接下來,我們從git上拉取protobuf的oc版本工程,存放目錄隨自己喜好。命令如下:
git clone https://github.com/alexeyxo/protobuf-objc.git
6. 編譯剛剛拉取的protobuf-objc工程,進入protobuf-objc工程目錄,依次執行如下命令
./autogen.sh
make
make install
注意:如果第3步的安裝和鏈接失敗,在第6步可能就不能成功了。我碰到了如下錯誤,多次研究後,終於發現原因是第3步未linked造成的。
./google/protobuf/descriptor.pb.h:2840:50: error: no member named 'GetEmptyStringAlreadyInited' in namespace 'google::protobuf::internal'
if (package_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
./google/protobuf/descriptor.pb.h:2848:50: error: no member named 'GetEmptyStringAlreadyInited' in namespace 'google::protobuf::internal'
if (package_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
./google/protobuf/descriptor.pb.h:2856:50: error: no member named 'GetEmptyStringAlreadyInited' in namespace 'google::protobuf::internal'
if (package_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
./google/protobuf/descriptor.pb.h:2864:50: error: no member named 'GetEmptyStringAlreadyInited' in namespace 'google::protobuf::internal'
if (package_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
./google/protobuf/descriptor.pb.h:2872:50: error: no member named 'GetEmptyStringAlreadyInited' in namespace 'google::protobuf::internal'
if (package_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
./google/protobuf/descriptor.pb.h:2876:75: error: no member named 'GetEmptyStringAlreadyInited' in namespace 'google::protobuf::internal'
package_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
7. 編寫.proto文件,即數據結構的描述文件,這裏不多說,直接上測試文件內容.
message Person {
required int32 id = 1;
required string name = 2;
optional string email = 3;
}
8. 利用protoc命令將.proto文件編譯成object-c代碼。
protoc --objc_out=./ Person.proto //oc版本,我們這裏只要這個
protoc --cpp_out=./ *.proto //c++版本
proton —java_out=./ *.proto //java版本
9. protobuf在ios中的使用。
在Podfile加入oc版本的protocol buffers運行時庫:
pod 'ProtocolBuffers', '~> 1.9.9.2’
10. 使用Person對象
引入Person.pb.h,Person.pb.m文件,編譯運行工程
demo:https://github.com/zhu410289616/RHSocketKit
服務端工程demo:RHSocketServerDemo
客戶度工程demo:RHSocketKitDemo
email: [email protected]
qq: 410289616
qq羣:330585393
2016.2.25