protobuf使用

1.下载protobuf
下载地址:http://code.google.com/p/protobuf/downloads/list


2.编译protobuf
解压下载的zip包,cd到protobuf的目录下,执行以下指令:
./configure
make
make check
make install


3.检查安装是否成功
protoc --version
如果成功,则会输出版本号信息,例如:libprotoc 2.5.0
如果有问题,则会输出错误内容。


4.错误及解决方法
protoc: error while loading shared libraries: libprotoc.so.8: cannot open shared
错误原因:
protobuf的默认安装路径是/usr/local/lib,而/usr/local/lib 不在Ubuntu体系默认的 LD_LIBRARY_PATH 里,所以就找不到该lib
解决方法:
1. 创建文件 /etc/ld.so.conf.d/libprotobuf.conf 包含内容:
[plain]  view plain  copy
  1. /usr/local/lib  
2. 输入命令
sudo ldconfig 


这时,再运行protoc --version 就可以正常看到版本号了


file.proto

 // Filename: addressbook.proto


 syntax="proto2";
 package addressbook;
 
 //import "src/help.proto";      //举例用,编译时去掉
 
 message Person {
     required string name = 1;
     required int32 id = 2;
     optional string email = 3;
 
     enum PhoneType {
         MOBILE = 0;
         HOME = 1;
         WORK = 2;
     }
 
     message PhoneNumber {
         required string number = 1;
         optional PhoneType type = 2 [default = HOME];
     }
 
     repeated PhoneNumber phone = 4;
 }
 
 message AddressBook {
     repeated Person person_info = 1;
 }


 #include <iostream>
 #include "file.pb.h"
 
 int main(int argc, const char* argv[])
 {
     addressbook::AddressBook person;
     addressbook::Person* pi = person.add_person_info();
 
     pi->set_name("aut");
     pi->set_id(1219);
     std::cout << "before clear(), id = " << pi->id() << std::endl;
     pi->clear_id();
     std::cout << "after  clear(), id = " << pi->id() << std::endl;
     pi->set_id(1087);
     if (!pi->has_email())
         pi->set_email("autyinjing@126.com");
 
     addressbook::Person::PhoneNumber* pn = pi->add_phone();
     pn->set_number("021-8888-8888");
     pn = pi->add_phone();
     pn->set_number("138-8888-8888");
     pn->set_type(addressbook::Person::MOBILE);
 
     uint32_t size = person.ByteSize();
     unsigned char byteArray[size];
     person.SerializeToArray(byteArray, size);
 
     addressbook::AddressBook help_person;
     help_person.ParseFromArray(byteArray, size);
     addressbook::Person help_pi = help_person.person_info(0);
 
     std::cout << "*****************************" << std::endl;
     std::cout << "id:    " << help_pi.id() << std::endl;
     std::cout << "name:  " << help_pi.name() << std::endl;
     std::cout << "email: " << help_pi.email() << std::endl;
 
     for (int i = 0; i < help_pi.phone_size(); ++i)
     {
         auto help_pn = help_pi.mutable_phone(i);
         std::cout << "phone_type: " << help_pn->type() << std::endl;
         std::cout << "phone_number: " << help_pn->number() << std::endl;
     }
     std::cout << "*****************************" << std::endl;
 
     return 0;
 } 


编译时使用:

g++ main.cc file.pb.cc -std=c++11  `pkg-config --cflags --libs protobuf`

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值