CocoaAsyncSocket 網絡通信使用之Protobuf安裝(五)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章