ios 平台 cocos2d-x 集成 protobuf

               

一、参考资料:

protobuf之为cocos2dx编译ios下的静态库

Android与ios引入protobuf ---for cocos2dx


二、系统、IDE及相关库的版本

OS X 10.8.3,XCode4.5.2,cocos2d-x2.1.4, protobuf2.5.0


三、失败症结:

1.从 google code上面无法下载到直接可用的库成品(.a + .h 或 .dylib + .h),也没有提供干净清新可以直接拿来用的代码。

能下载到的只会是同一份过分完整源码的三种不同格式的压缩包。。有点儿坑爹。。

(过分完整:各种各样的测试 proto、compiler 模块和 gtest 同重用代码混杂在一起)

2.XCode 各种不引用(即使建立了对 protobuf 代码的引用关系,也要再设置一遍 Header Search Paths 才能找到头文件)。

3.protobuf 可以用 ./configure -> make -> make check -> make install 这依次执行的 4 个命令完成安装。

会在系统目录里面生成 libprotobuf.a、libprotobuf.dylib、protoc 编译器和相关头文件。

4.在protobuf 源码包得部分文件中存在 main 函数,这么一来不注意不做处理的情况下,

势必出现 duplicated symbol 'main' 的错误。

5.在做 protobuf  的 CocoaTouch 静态库的时候,须将编译器由  apple llvm 改为 llvm-gcc。

不然会出现 <tr1/unodered_map.h> 头文件找不到的错误。


四、调试流程:

为减少外界因素对集成 protobuf 所带来的负面影响,首先在 CocoaTouch 静态库工程中做打包测试。

0.执行上述的4个命令完成 protobuf 的安装

(编译 .proto 文件需要安装时生成的可执行文件 protoc,另外,打包成静态库还需要在源码根目录生成出来的 config.h 头文件)。

1.首先新建一个 CocoaTouch 静态库工程。

2.将工程中的默认生成的两个与工程名同名的代码文件删除掉。

3.将 protobuf 源码目录(该目录包含如下目录结构:src/google/)拽入工程。

弹出的对话框选项中勾选 copy,create group refferences,target 也要勾选上。

4.将 protobuf 源码中除  src 目录和安装生成出来的 config.h 文件以外的其他文件和目录统统删掉(move to trash)。

5.继续删,将 src 目录下除 google 以外的文件和文件夹统统删掉(move to trash)。

6.继续删,将 src/google/protobuf 目录下的 compiler 目录删掉(move to trash)。

7.继续,将所有文件名包含 unittest 字符串的文件统统删掉(move to trash)—— 可考虑写段程序完成此种机械化的操作。

8.继续,将除  descriptor.proto、descriptor.pb.h、descriptor.pb.cc 以外的其他 .proto、.cc 及相关的 .h 文件删掉(。。。)。

9.继续,src/google/protobuf 目录下的 testdata 目录以及其中的内容,删掉!

10.继续,src/google/protobuf/testing 目录下的 zcgunzip.cc 和 zcgzip.cc 删掉!

11.这里就差不多了,填下 HeaderSearchPaths,改下编译器为 llvm-gcc 后即可。

这里附带 protobuf cocoaTouch 静态库工程和 ios cocos2dx 集成 protobuf 的工程


五、补充

今天解决了一个问题,本来准备写一个 demo 工程来做一下记录,

结果发现 mac command-line 的工程集成 protobuf  又出现了问题。

具体情况是这样的,之前我是将 protobuf 集成到 cocos2d-x 模板工程里面的,只要按照上述的方式操作就没什么问题。

但是换到  mac  command-line 工程里面以后,却给我报出错误说 <tr1/unordered_map> 头文件找不到,在网上查了一下也没有找到相关的资料。

然后突然想到,在运行正常的工程里面点一下 “转到定义” 不就知道这个头文件到底是在哪里了么,

试了一下以后发现是在 ios sdk 下面的,但 mac command-line 的工程并不能使用ios-sdk,这就有点儿头疼了 。

思索良久决定在仔细看一下出错位置附近的代码,如下:

#if defined(HAVE_HASH_MAP) && defined(HAVE_HASH_SET)#include HASH_MAP_H#include HASH_SET_H#else#define MISSING_HASH#include <map>#include <set>#endif
这里报出的错误是 '<tr1/unordered_map>'  file not found

HASH_MAP_H 宏即是 <tr1/unordered_map>

这样的话就找到问题的症结了,只要在  config.h 配置头文件中取消 HASH_MAP_HHASH_SET_H 的定义不就可以了么。。

<map><set> 都是 c++ std 标准库 里面经典的老骨头了,肯定不会再出现找不到头文件的错误了~

试了一下之后果然解决了这个问题,不过旧的问题刚解决,新的问题马上就又来了。。。。

Undefined symbols for architecture x86_64:  "_deflate", referenced from:      google::protobuf::io::GzipOutputStream::Deflate(int) in gzip_stream.o  "_deflateEnd", referenced from:      google::protobuf::io::GzipOutputStream::Close() in gzip_stream.o  "_deflateInit2_", referenced from:      google::protobuf::io::GzipOutputStream::Init(google::protobuf::io::ZeroCopyOutputStream*, google::protobuf::io::GzipOutputStream::Options const&) in gzip_stream.o  "_inflate", referenced from:      google::protobuf::io::GzipInputStream::Inflate(int) in gzip_stream.o  "_inflateEnd", referenced from:      google::protobuf::io::GzipInputStream::~GzipInputStream() in gzip_stream.o      google::protobuf::io::GzipInputStream::Next(void const**, int*) in gzip_stream.o  "_inflateInit2_", referenced from:      google::protobuf::io::internalInflateInit2(z_stream_s*, google::protobuf::io::GzipInputStream::Format) in gzip_stream.old: symbol(s) not found for architecture x86_64clang: error: linker command failed with exit code 1 (use -v to see invocation)
故技重施,再次跑到能正常运行的工程里面去查看工程设置,对比到底哪儿存在差异。

可能之前遇到过这个问题,当我瞟到 other linker flags 里面有一个 -lxml2 -lz 的时候,

我突然就想到问题可能就出在这个 -lz 上面,然后再想到 deflate 不就是解压缩的意思么,

然后就试着也在出问题的工程里面加上了  -lz 这个 other linker flags,然后清理、运行,一切回归正常~





           

猜你喜欢

转载自blog.csdn.net/qq_44894420/article/details/89278303