是适用于iOS的metasyntactic静态库。 。 。
http://code.google.com/p/metasyntactic/wiki/ProtocolBuffers
。 。 。 与普通的老C ++编译protofiles兼容? 我不想使用捆绑的编译器生成的OBJ-C。
有什么办法来编译由谷歌为iOS提供的图书馆吗?
是适用于iOS的metasyntactic静态库。 。 。
http://code.google.com/p/metasyntactic/wiki/ProtocolBuffers
。 。 。 与普通的老C ++编译protofiles兼容? 我不想使用捆绑的编译器生成的OBJ-C。
有什么办法来编译由谷歌为iOS提供的图书馆吗?
好。 看来,metasyntactic库(或任何其他第三方库)在这种情况下没有必要。 你可以只直接添加谷歌源到项目中。 我发现从尼古拉Ferruzzi在谷歌讨论组如下回答。 。 。
原来答案就在这里。 。 。
http://groups.google.com/group/protobuf/browse_thread/thread/ca4218d7db144252
这个答案的内容与图像,使一个永久记录包含如下...
编辑
由于在试图首次今晚再次,我需要除了那些下面列出几个步骤(这一点也适用protobuf的2.5.0)。
find . -name "*unittest*" -exec rm -rf {} \;
find . -name "*unittest*" -exec rm -rf {} \;
testing
#include <google/protobuf/testing/googletest.h>
在stringprintf.cc
我在我的应用程序使用最新版本的..你并不真的需要,如果你熟悉C objc直接++的支持,只有一个,你必须从通过的std ::点串NSData的,反之亦然。 而它很简单。
为了编译和测试伊夫发现是刚刚导入整个谷歌目录在我自己的项目:)最简单的方法(第二次,你可以使自己的框架,但为测试这个程序只是工作)
- 下载最新版本
- AUTOGEN配置,让像你刚才建设的MacOSX(你需要命令行工具)。 这样,你最终protoc
二进制和MacOSX的图书馆(你不需要)- 打开你的Xcode的iOS项目
- 加上“新文件”到你的项目,并选择谷歌目录
- 谷歌头的目录添加到您的附加包含目录
- 从protobuffer src目录添加的config.h到您的应用
- 从谷歌组中删除包含UNITEST一切:)
- 从谷歌组中删除编译器和Java东西;
你应该能够没有任何链接错误编译。 为了给你一个想法,这是我直接编译
然后你可以使用protoc生成C ++源文件的协议。 与objc使用它们,你必须重命名你的源到文件“毫米”,那么你可以这样做
TO序列化的NSData
假设你的消息被称为包
- (NSData *)getDataForPacket:(Packet *)packet { std::string ps = packet->SerializeAsString(); return [NSData dataWithBytes:ps.c_str() length:ps.size()];
来读取的NSData
- (Packet *)getPacketFromNSData:(NSData *)data { char raw[[data length]]; Packet *p = new Packet; [data getBytes:raw length:[data length]]; p->ParseFromArray(raw, [data length]); return p; }
你可以到一个Xcode 5项目中使用的CocoaPods通过添加以下行到你的Podfile增加对谷歌协议缓冲器支持。
pod 'GoogleProtobuf', '~> 2.5.0'
这将会把C ++版本的protobuf代码为波德为您的项目。 这也将添加protoc
编译器的文件夹中Pods/GoogleProtobuf/bin/protoc
您的项目中。
您可以在项目中创建自动的转换一个自定义生成规则.proto
文件转换成.ph.{h,cc}
文件。 这里是我是怎么做的:
设置一个生成规则“过程的源文件名称相符:* .proto使用自定义脚本”。 该脚本应包括以下内容:
cd ${INPUT_FILE_DIR}
${SRCROOT}/Pods/GoogleProtobuf/bin/protoc --proto_path=${INPUT_FILE_DIR} ${INPUT_FILE_PATH} --cpp_out=${INPUT_FILE_DIR}/cpp
设置输出文件,包括以下内容:
$(INPUT_FILE_DIR)/cpp/$(INPUT_FILE_BASE).pb.h
$(INPUT_FILE_DIR)/cpp/$(INPUT_FILE_BASE).pb.cc
任何.proto
您的包含文件在您的项目现在会自动转换为C ++,然后编译作为构建的一部分。
编辑 :我已经回答了这个较早,但被主持人删除。 所以我已经包括从教程一些代码。
该教程的答案发布上述这几乎是一样的- 在iOS和Mac的Objective-C的使用谷歌协议缓冲器
按照learnvst的答案给出的步骤,并参阅了陷阱的意见。 我跟着除了完全相同的步骤
谷歌头的目录添加到您的附加包含目录加入我的头搜索路径src /目录,而不是谷歌的目录。
此外,当我做了#import xyz.pb.h
该项目没有建设。 当我重新命名.m文件到.mm我是能够建立。 这一点在本教程中提到的非常微妙的:P。
基本上,这是导入任何.pb.h文件的任何.m文件,应以延长.mm改名
下面是本教程的一些内容 -
原型文件
package kotancode;
enum ZombieType {
SLOW = 0;
FAST = 1;
}
message ZombieSighting {
required string name = 1;
required double longitude = 2;
required double latitude = 3;
optional string description = 4;
required ZombieType zombieType = 5 [default = SLOW];
}
ZombieSightingMessage.h
// -- ZombieSightingMessage.h - note my C++ object is not in the public interface.
#import <Foundation/Foundation.h>
@interface ZombieSightingMessage : NSObject
- (void)doSomething;
@end
ZombieSightingMessage.mm
// -- ZombieSightingMessage.mm
#import <UIKit/UIKit.h>
#import "ZombieSightingMessage.h"
#import "zombie.pb.h"
@implementation ZombieSightingMessage
- (void)doSomething {
// Doing random stuff with a UIView here to show the mixing
// of C++ and Objective-C/Cocoa syntax in the same file...
UIView *uiView = [[UIView alloc] init];
[uiView setCenter:CGPointMake(20, 10)];
// instantiate my protobuf-generated C++ class.
kotancode::ZombieSighting *zombieSighting = new kotancode::ZombieSighting();
zombieSighting->set_name("Kevin");
zombieSighting->set_description("This is a zombie");
zombieSighting->set_latitude(41.007);
zombieSighting->set_longitude(21.007);
zombieSighting->set_zombietype(kotancode::ZombieType::FAST);
// Some small tomfoolery required to go from C++ std::string to NSString.
std::string x = zombieSighting->DebugString();
NSString *output = [NSString stringWithCString:x.c_str() encoding:[NSString defaultCStringEncoding]];
NSLog(@"zombie: %@", output);
// Instantiate another zombie from the previous zombie's raw bytes.
NSData *rawZombie = [self getDataForZombie:zombieSighting];
kotancode::ZombieSighting *otherZombie = [self getZombieFromData:rawZombie];
// Dump the second zombie so we can see they match identically...
NSString *newOutput = [NSString stringWithCString:otherZombie->DebugString().c_str() encoding:[NSString defaultCStringEncoding]];
NSLog(@"other zombie: %@", newOutput);
// Grimace all you want, but this is C++ and we need to clean up after ourselves.
free(zombieSighting);
free(otherZombie);
}
// Serialize to NSData. Note this is convenient because
// we can write NSData to things like sockets...
- (NSData *)getDataForZombie:(kotancode::ZombieSighting *)zombie {
std::string ps = zombie->SerializeAsString();
return [NSData dataWithBytes:ps.c_str() length:ps.size()];
}
// De-serialize a zombie from an NSData object.
- (kotancode::ZombieSighting *)getZombieFromData:(NSData *)data {
int len = [data length];
char raw[len];
kotancode::ZombieSighting *zombie = new kotancode::ZombieSighting;
[data getBytes:raw length:len];
zombie->ParseFromArray(raw, len);
return zombie;
}
@end
编辑 :我使用的Xcode 4.5。 我跟所有的步骤后,即使我得到一个连接错误。
符号未找到i386硬件架构
由于这个我不能运行模拟器的代码。 但它的工作实际设备上
我猜根据实际的问题我的意见是值得张贴作为一个答案:
我使用所提供的原生的OBJ代码生成的稍作修改的版本Booyah
它支持重复的开箱但为了使用需要将PBArray类型(基本上是类型的C缓冲液)转换为NSObjects的阵列,它代表ObjC快速枚举字段 - 无论是NSNumber的或对象的protobuf的消息。 你可以看到在更新后的快速列举的示例代码这一变化 。 你还可以添加一个类别上PBArray称为toObjects。
我只是用标记生成的代码-fno-objc-arc
,但你可以得到电弧,并从2.5的支持booyah引入请求 。
的方向是建立相当不错的,但如果人们想在我使用的范畴,我怎么建成的protobuf-objc插件更明确的指示,如何为类前缀(例如IXMyProtoMessage而不是MyProtoMessage)的支持或如何生成代码让我知道,我会尽量留出时间来写了一个帖子。 我使用它与很多跨项目依赖的> 50个原文件。
该库的一个弱点是,它不包括对所生成的代码,这样做类似的消息转换为NSDictionary中典型的Protobuf反射API会做一些哈克的东西与objC运行时(代码不遵循典型KV合规性)或写来自确实有反射API(我这样做是使用Python +的Jinja2)PROTOS自定义代码生成器。 或者 - 更好,但类似的困难,并增加反射API来代码生成器)。