使用xCode 5编译protobuf

6

我想在我的项目中使用protobuf(https://code.google.com/p/protobuf/)。

你是否已经成功地在xCode 5中编译过protobuf,请分享一下你的经验?

谢谢!

2个回答

11

您可以通过将以下代码添加到您的Podfile中,使用Cocoapods为Xcode 5项目添加对Google Protocol Buffers的支持。

pod 'GoogleProtobuf', '~> 2.5.0'

这将把protobuf的C++版本代码放入您项目的Pod中。还会在项目文件夹Pods/GoogleProtobuf/bin/protoc中添加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++,并作为构建的一部分进行编译。


谢谢!我会尝试一下。 - Huy Tran
我发现这个解决方案存在问题。在Cocoapod中构建的版本只能在iOS模拟器上使用。我正在努力解决这个问题。目前,您可以使用我在下面备选答案中发布的其他方法。 - Bennett Smith
你好,史密斯。我已经使用CocoaPods为iPad构建了protobuf(2.4.1)并且它可以正常工作。我会看一下你的新方案。谢谢! - Huy Tran
由于某种原因,当我这样做时,.proto文件本身被复制到输出应用程序文件夹中。有什么想法可以防止这种情况发生吗? - shoosh
@BennettSmith 我试过了cocoapods的解决方案,但我总是先遇到链接器错误,首先是Undefined symbols for architecture armv7: "_deflate", referenced from:我已经尝试将libz.dylib作为链接二进制库添加,但没有帮助。你有什么建议来解决这个问题吗? - tmbo
1
使用Protobuf的homebrew版本(brew install protobuf)而不是Cocoapods进行了此操作。按照上述描述的构建规则设置,它可以完美地工作!一个值得注意的补充说明可能对某些人(如我)不太明显:“包含在您的项目中”实际上意味着将.proto文件添加到您项目的“编译源”构建阶段中。 - bfx

10
如果您不介意手动构建Google Protobuf,则使用Cocoapods的好替代方案是运行此处的bash脚本。 https://gist.github.com/BennettSmith/7150245 该脚本将产生一个支持i386、armv7、armv7s、arm64和x86_64体系结构的正确构建的Google Protobuf。它将生成一个通用的静态库。同时还会生成可在OS X上使用的protoc编译器。

1
我只是想知道这个脚本是否适用于protobuf 2.4.1?我能否删除x86_64的构建(只需要iOS)? - Huy Tran
我不确定2.4.1版本是否有特别的原因要使用,而不是更新的2.5.0版本? - Bennett Smith
没有特别的原因,只是因为我的当前项目正在使用protobuf 2.4.1版本。 - Huy Tran
我在处理脚本时遇到了问题。扫描build.log文件,我看到有几个关于构建的错误。查看config.log文件,似乎在尝试调用clang时出现了错误。根据上面的评论,它应该可以直接使用OOTB,对吧?config.log输出: http://pastebin.com/v6sEr0Chbuild.log输出: http://pastebin.com/gNjgU9S9因此,据我所知,没有生成任何内容,特别是通用或arm64版本。 :( 提前致谢! - Michael Nguyen
@BennettSmith - 你的脚本很棒。但是我在使用arm64时遇到了相同的问题。我们删除了该部分并使脚本完美运行。我们现在不使用arm64,所以目前还好。只是好奇,如果我们尝试使用arm64,你知道如何修复吗? - Patricia
现在有一个更新版本的脚本可用,它使用Xcode 6构建Google Protobuf 2.6.0。这个版本包括了arm64的构建,而这是2.5.0版本所不可能的。您可以在这里找到更新的脚本:https://gist.github.com/BennettSmith/9487468ae3375d0db0cc - Bennett Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接