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

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