Is the metasyntactic static library for iOS . . .
http://code.google.com/p/metasyntactic/wiki/ProtocolBuffers
. . . compatible with regular old C++ compiled protofiles? I do not want to use the bundled compiler that generates Obj-C.
Is there any way to compile the library supplied by Google for iOS?
Protocol buffers, or Protobuf, is a binary format created by Google to serialize data between different services. Google made this protocol open source and now it provides support, out of the box, to the most common languages, like JavaScript, Java, C#, Ruby and others.
Protocol buffers provide a language-neutral, platform-neutral, extensible mechanism for serializing structured data in a forward-compatible and backward-compatible way. It's like JSON, except it's smaller and faster, and it generates native language bindings.
proto files into Swift, you will need both Google's protoc compiler and the SwiftProtobuf code generator plugin. This will create a binary called protoc-gen-swift in the . build/release directory. To install, just copy this one executable into a directory that is part of your PATH environment variable.
JSON is usually easier to debug (the serialized format is human-readable) and easier to work with (no need to define message types, compile them, install additional libraries, etc.). Protobuf, on the other hand, usually compresses data better and has built-in protocol documentation via the schema.
Ok. It appears that the metasyntactic library (or any other 3rd party library) is unnecessary in this case. You can just add the Google source directly to your project. I found the following answer from Nicola Ferruzzi in a google discussion group . . .
The original answer is here . . .
http://groups.google.com/group/protobuf/browse_thread/thread/ca4218d7db144252
The content of this answer is included below with images to make a permanent record ...
EDIT
Since trying this again tonight for the first time in a while, I needed a couple more steps in addition to those outlined below (this works with protobuf 2.5.0).
find . -name "*unittest*" -exec rm -rf {} \;
testing
#include <google/protobuf/testing/googletest.h>
in stringprintf.cc
I use latest version in my app .. you don't really need objc direct support if you are familiar with C++, there is only one point where you have to pass from std::string to NSData and viceversa. And its pretty simple.
To compile and test the easiest way Ive found is to just import the whole google directory in my own project :) (the second time you can make your own framework but for testing this procedure just works)
- download latest version
- autogen configure and make like you were just building for macosx (you need command line tools) . This way you end up with protoc
binary and the library for macosx (which you don't need)- open your Xcode iOS project
- add "new file" to your project and select google directory
- add the directory of google headers to your additional include directories
- add config.h from the protobuffer src directory to your app
- from the google group remove everything that contains unitest :)
- from the google group remove compiler and java stuff;
You should be able to compile without any linking error. To give you an idea this is what I directly compile
Then you can use protoc to generate c++ source files for your protocol. To use them with objc you have to rename your source to file "mm" then you can do something like
TO SERIALIZE TO NSDATA
let's say your message is called Packet
- (NSData *)getDataForPacket:(Packet *)packet { std::string ps = packet->SerializeAsString(); return [NSData dataWithBytes:ps.c_str() length:ps.size()];
TO READ FROM 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; }
You can add support for Google Protocol Buffers to an Xcode 5 project using Cocoapods by adding the following line to your Podfile.
pod 'GoogleProtobuf', '~> 2.5.0'
This will place the C++ version of the protobuf code into a Pod for your project. It will also add the protoc
compiler in the folder Pods/GoogleProtobuf/bin/protoc
within your project.
You can create a custom build rule in your project that automatically converts the .proto
files into .ph.{h,cc}
files. Here is how I did that:
Setup a build rule to "Process Source files with names matching: *.proto Using Custom Script". The script should include the following:
cd ${INPUT_FILE_DIR}
${SRCROOT}/Pods/GoogleProtobuf/bin/protoc --proto_path=${INPUT_FILE_DIR} ${INPUT_FILE_PATH} --cpp_out=${INPUT_FILE_DIR}/cpp
Set the output files to include the following:
$(INPUT_FILE_DIR)/cpp/$(INPUT_FILE_BASE).pb.h
$(INPUT_FILE_DIR)/cpp/$(INPUT_FILE_BASE).pb.cc
Any .proto
files you include in your project will now automatically be converted to C++ and then compiled as part of your build.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With