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