ios&mac下编译protobuf C++静态库

       公司项目中使用了protobuf-lua作为网络消息的传输格式,虽然使用protobuf有一段时间了,但是对于其使用环境的搭建还是不很清楚,趁着周末闲暇,就自己动手实践了一下。尽管网上有不少相关教程,但是当按照教程去做的时候,总会遇到各种各样的坑,把这些坑填完了,就会有一套自己的做事流程及注意的地方,这些都是宝贵的经验。

       构建ios版静态库

1.下载最新版本的protobuf包,解压。 这里用到的是protobuf-2.6.1,下载地址
https://github.com/google/protobuf/releases

2.打开Xcode新建CocoaTouchStaticLibrary项目,名称随便取,最好不要有汉字,避免出现异常错误。
ios&mac下编译protobuf C++静态库_第1张图片


3.路径选择为protobuf解压后的根目录,创建好项目后删除默认生成的两个文件protobufStatic.h和.m 文件。
添加src/google/目录下的所有文件添加到项目中,添加完成后如下图
ios&mac下编译protobuf C++静态库_第2张图片

ios&mac下编译protobuf C++静态库_第3张图片


4.删除项目中所有的测试文件,搜索test 如下图,然后选中所有出现的文件右键删除。删除complier文件夹,删除testdata文件夹。如果文件中有.lo和.o文件也要一并删除,以上删除方式要选择 movetoreference.
ios&mac下编译protobuf C++静态库_第4张图片
5.打开终端,cd到protobuf根目录下,执行./configure后生成config.h文件,把它加到项目中如下图
ios&mac下编译protobuf C++静态库_第5张图片

6.添加头文件引用找到 SearchPaths->Header Search Paths,然后把src添加进去。
ios&mac下编译protobuf C++静态库_第6张图片

7.修改编译参数 Edit Scheme,把Run中的Build Configuration 改为Release,把Build中得protobufTests的Run选项的勾取消掉。
ios&mac下编译protobuf C++静态库_第7张图片

ios&mac下编译protobuf C++静态库_第8张图片
ios&mac下编译protobuf C++静态库_第9张图片

8.据说ios系统中使用了google protobuf 因此在编译成静态库时需要改变一下protobuf的命名空间名字,不过在没有修改命名空间名字的情况下编译生成的静态库也能正常使用,没有出现崩溃的现象,为避免不必要的麻烦还是修改一下命名空间吧,打开google/protobuf/stubs/comment.h 修改如下。
ios&mac下编译protobuf C++静态库_第10张图片


9.编译时选择ios Device,然后cmd+r 编译项目,完成后会生成静态库
ios&mac下编译protobuf C++静态库_第11张图片

10.在libprotobufStatic.a上右键选择showinfinder打开静态库文件所在目录
ios&mac下编译protobuf C++静态库_第12张图片

11.ios中测试。由于以后要用在cocos2d-x项目中,所以这里使用的是cocos2d-x的项目进行测试
首先编写proto文件,文件名为HelloWorld.proto
package lm;
message HelloWorld{
    required int32 id=1;
    required string str=2;
    optional int32 opt=3;
}

接下来把proto文件编译成c++ 版本,以便在cocos2d-x项目中使用。要编译proto文件,我们得有protoc编译器。打开终端回到解压后的protobuf根目录下,依次执行 make->make check->make install 这样就安装了protoc编译器,安装路径为
/usr/local/Cellar/protobuf
 
在终端里cd到HelloWorld.proto文件所在的文件夹
执行 protoc -I=./ —cpp_out=./ HelloWorld.proto (注意参数之间用空格隔开)会在当前文件夹里生成 HelloWorld.pb.h和HelloWorld.pb.cc文件。

在cocos2d-x项目中测试
(1)打开Xcode 导入HelloWorld.pb.h和HelloWorld.pb.cc
  (2)导入静态库
(3)再HeadSearchPaths中 设置静态库头文件的搜索路径,最好把protobuf/src目录拷贝到当前工程中,
(4)在HelloWorld.h中添加两个方法和一个string变量。
    void writer();
    void reader();
    std::string pStr;
在HelloWorld.cpp中添加头文件
#include "HelloWorld.pb.h"
#include
#include

完成两个方法
void HelloWorld::writer()
{
    lm::HelloWorld msg1;
    msg1.set_id(10);
    msg1.set_str("hello protobuf");
    msg1.set_opt(4);
    
    
//    std::fstream output("./log", std::ios::out | std::ios::trunc | std::ios::binary);
    
    if (!msg1.SerializeToString(&pStr)) {
        std::cerr << "Faild to write msg" << std::endl;
        return ;
    }
    return ;
}

void HelloWorld::reader()
{
    lm::HelloWorld msg2;
    
//    std::fstream input("./log", std::ios::in | std::ios::binary);
    
    if (!msg2.ParseFromString( pStr )) {
        std::cerr << "Faild to parse msg" << std::endl;
        return ;
    }
    
    std::cout << msg2.id() << std::endl;
    std::cout << msg2.str() << std::endl;
}


将两个方法依次在init() 中调用 会看到输出栏里显示了我们在writer() 方法中存到pStr中的数据。


12.mac 版protobuf静态库的编译与上面的方法一样。唯一不同的是要新建一个mac项目

ios&mac下编译protobuf C++静态库_第13张图片

ios&mac下编译protobuf C++静态库_第14张图片




你可能感兴趣的:(C++,ios,cocos2dx)