文档章节

ProtocolBuffer for Objective-C 运行环境配置(真正测试过的)

S
 Snaiper
发布于 2015/09/18 15:28
字数 867
阅读 607
收藏 1

1、下载ProtocolBuffer包(2.5版本与下面的object-c插件不兼容,建议下载2.4.1版本的):


             http://code.google.com/intl/zh-CN/apis/protocolbuffers/

     编译安装(生成的编译器protoc在/usr/local/bin目录下):


           cd protobuf-2.4.1

           ./configure
           make
           make install


2、下载Objective-C compiler for ProtocolBuffer(目前有两种类型的实现)。


    (1)、针对ProtocolBuffer2.2做修改,使最后生成的.proto文件编译器(protoc)支持Objective-C类型的文件输出。

                       http://code.google.com/p/metasyntactic/wiki/ProtocolBuffers

    (2)、针对ProtocolBuffer2.3推出的plugin模式编写插件,以插件方式支持Objective-C类型的文件输出。

                       https://github.com/booyah/protobuf-objc

        我选用第(1)种方式,这也是Google推荐的方式。

                        http://code.google.com/p/metasyntactic/wiki/ProtocolBuffers,下载源码压缩包后解压到相关目录

        进入该目录,并执行:


                       cd  ProtocolBuffers-2.2.0-Source

                       ./configure
                       make
                       make install

没有这么顺利


google/protobuf/message.cc:130:60: error: implicit instantiation of undefined
      template 'std::__1::basic_istream<char, std::__1::char_traits<char> >'
  return ParseFromZeroCopyStream(&zero_copy_input) && input->eof();
                                                           ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iosfwd:109:33: note: 
      template is declared here
    class _LIBCPP_TYPE_VIS_ONLY basic_istream;
                                ^
google/protobuf/message.cc:135:67: error: implicit instantiation of undefined
      template 'std::__1::basic_istream<char, std::__1::char_traits<char> >'
  return ParsePartialFromZeroCopyStream(&zero_copy_input) && input->eof();
                                                                  ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iosfwd:109:33: note: 
      template is declared here
    class _LIBCPP_TYPE_VIS_ONLY basic_istream;
                                ^
2 warnings and 2 errors generated.
make[2]: *** [message.lo] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2

  • 解决方法如下:

找到文件src/google/protobuf/message.cc     在文件的第一个#include之上的一行,加入 

#include <istream>

继续运行make ,即成功通过。



3、测试.proto文件编译


        写一个person.proto文件:

[cpp] view plaincopy

  1. message Person {  

  2.  required string name = 1;  

  3.  required int32 id = 2;  

  4.  optional string email = 3;  

  5.    

  6.  enum PhoneType {  

  7.     MOBILE = 0;  

  8.     HOME = 1;  

  9.     WORK = 2;  

  10.  }  

  11.    

  12.  message PhoneNumber {  

  13.     required string number = 1;  

  14.     optional PhoneType type = 2 [default = HOME];  

  15.  }  

  16.    

  17.  repeated PhoneNumber phone = 4;  

  18. }  



        编译该文件:

                protoc  person.proto   --objc_out=/Output/Directory/   


        protoc会使用该插件编译.proto文件,最终生成两个文件:Person.pb.h 、Person.pb.m(不支持ARC


        如果工程中使用了ARC ,所以需要使用-fno-objc-arc来标识相关的文件不使用ARC机制:



        这个步骤通过后,说明ProtocoBuffer Compiler for Objective-C可以正常工作了。

4、在Xcode中使用ProtocolBuffer


        将步骤2中protobuf-obj/src/runtime/Classes目录导入到Xcode项目中,导入时,选中”Copy items into destination group‘s folder(if needed)“。

        导入位置选择项目根目录。导入完毕后,项目根目录下将会出现Classes目录,将该目录改名为ProtocolBuffers(注意最后的s): mv Classes ProtocolBuffers

        修改项目属性中”Build Settings-->Search Paths-->Header Search Paths”,将项目根目录“.”添加到头文件搜索路径中去。

        这样ProtocolBuffer for Objective-C的工作环境就配置好了。


5、使用


        1)、将步骤3中编译输出的Person.pb.h 和Person.pb.m添加到项目中


        2)、将Person.pb.h 中的 #import <ProtocolBuffers/ProtocolBuffers.h> 改为#import"ProtocolBuffers/ProtocolBuffers.h"


        3)、在需要使用的地方引入头文件:#import "Person.pb.h"

[cpp] view plaincopy

  1. - (void)viewDidLoad  

  2. {  

  3.     [super viewDidLoad];  

  4.     // Do any additional setup after loading the view, typically from a nib.  

  5.       

  6.     [self writeAndReadProtobuf];  

  7. }  

  8.   

  9. - (void)writeAndReadProtobuf{  

  10.     Person *person = [[[[[Person builder] setName:@"极致"]  

  11.                         setId:1]  

  12.                        setEmail:@"abc@163.com"] build];  

  13.     NSData *data = [person data];  

  14.       

  15.     NSString *docPath = [self applicationDocumentsDirectory];  

  16.     NSString *path = [docPath stringByAppendingFormat:@"/person.data"];  

  17.       

  18.     if ([data writeToFile:path atomically:YES]) {  

  19.         [self readFileWithPath:path];  

  20.     }  

  21. }  

  22.   

  23. - (NSString *)applicationDocumentsDirectory {  

  24.       

  25.     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  

  26.     NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;  

  27.     return basePath;  

  28. }  

  29.   

  30. - (void)readFileWithPath:(NSString *)path {  

  31.       

  32.     NSData *data = [NSData dataWithContentsOfFile:path];  

  33.     Person *person = [Person parseFromData:data];  

  34.       

  35.     if (person) {  

  36.         NSLog(@"\n id %d \n name: %@ \n email: %@ \n",person.id, person.name, person.email);  

  37.     }  

  38. }  

输出打印的结果如下:

              

遇到的问题:


          在执行 ./autogen.sh时出现错误:   
./autogen.sh: line 10: autoreconf: command not found

          

          解决办法:需要安装automake和autoconf:


                      brew install automake

                      brew install autoconf 


本文转载自:http://blog.csdn.net/muyu114/article/details/46516715

S
粉丝 13
博文 100
码字总数 135194
作品 0
深圳
私信 提问
ProtocolBuffer Mac安装步骤(亲测可用)

一、安装ProtocolBuffer 附下载地址*** ProtocolBuffer2.4.1下载地址 翻墙 http://code.google.com/p/protobuf/downloads/list 国内 http://pan.baidu.com/s/1lgGn8 * 下载之后,进入压缩包所......

xx541100047
2014/10/14
0
0
protocolbuffers应用在iOS的配置以及使用方法

Protocol Buffers 是 Google 出品的用来序列化/反序列化数据的工具。原生支持 C++、Java、Python。 如果要在 iOS 上使用 PB,可以直接使用 C++,但是编译过程很麻烦,因此这里使用的是第三方...

啊子同
2016/11/14
221
0
GNUstep 的安装

由于暂时还没有Mac的本本,只能现在Linux上练习Objective-C的语法了,安装的过程并不顺利,这里采用的平台依旧是Debian, Windows也是可以的, GNUstep 是一个跨平台的Objective-C的编译运行环...

鉴客
2011/11/23
2.6K
1
WINDOWS 下搭建 OC 集成开发环境

Objective-C是苹果软件的编程语言,想要上机学习、调试,有一个集成开发环境(IDE)方便很多。有三类方法搭建Objective-C的集成开发环境: 1) 使用苹果的平台,集成开发环境使用Xcode。但如果...

卧龙小
2014/08/29
5.2K
2
学Objective-C后如何进行IOS软件开发呢

这两天也开始学习了objective-c, 因为自己有C基础(应该说还算扎实)同时有一点java经验. objective-c虽然是C的衍生但感觉还是差别很大. 通过这两天对xcode4.4.1的初步了解后发现其界面开发能力...

fcsong000833
2013/01/24
375
1

没有更多内容

加载失败,请刷新页面

加载更多

前端技术之:Prisma Demo服务部署过程记录

安装前提条件: 1、已经安装了docker运行环境 2、以下命令执行记录发生在MackBook环境 3、已经安装了PostgreSQL(我使用的是11版本) 4、Node开发运行环境可以正常工作 首先需要通过Node包管...

popgis
今天
5
0
数组和链表

数组 链表 技巧一:掌握链表,想轻松写出正确的链表代码,需要理解指针获引用的含义: 对指针的理解,记住下面的这句话就可以了: 将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指...

code-ortaerc
今天
4
0
栈-链式(c/c++实现)

上次说“栈是在线性表演变而来的,线性表很自由,想往哪里插数据就往哪里插数据,想删哪数据就删哪数据...。但给线性表一些限制呢,就没那么自由了,把线性表的三边封起来就变成了栈,栈只能...

白客C
今天
43
0
Mybatis Plus service

/** * @author beth * @data 2019-10-20 23:34 */@RunWith(SpringRunner.class)@SpringBootTestpublic class ServiceTest { @Autowired private IUserInfoService iUserInfoS......

一个yuanbeth
今天
5
0
php7-internal 7 zval的操作

## 7.7 zval的操作 扩展中经常会用到各种类型的zval,PHP提供了很多宏用于不同类型zval的操作,尽管我们也可以自己操作zval,但这并不是一个好习惯,因为zval有很多其它用途的标识,如果自己...

冻结not
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部