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版本工程,存放目录随自己喜好。命令如下:
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
- protoc --cpp_out=./ *.proto
- proton —java_out=./ *.proto
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