我个人的protobuf-3.5.2实践:安装与测试

12 篇文章 0 订阅

环境:CentOS7

 

1、安装

github源代码下载地址:https://github.com/google/protobuf


chmod 777 -R protobuf-3.5.2
cd protobuf-3.5.2
./autogen.sh
./configure
make
make install
ldconfig #refresh shared library cache

 

执行protoc --version命令可以查看版本

firecats-MacBook-Pro:~ liuquandan$ which protoc

/usr/local/bin/protoc

firecats-MacBook-Pro:~ liuquandan$ protoc --version

libprotoc 3.5.2


通常情况ProtoBuf都安装在/usr/local目录下,该目录下包含了ProtoBuf的头文件,静态库和动态库文件
/usr/local/bin/protoc
/usr/local/include/google/protobuf
/usr/local/lib/libprotobuf.*

protoc:protobuf自带的编译工具,将.proto文件生成指定的类
–cpp_out:指定输出特定的语言和路径

 

 

 

2、写demo测试

helloworld.proto

syntax = "proto3";

package lm; 
message helloworld 
{ 
    int32     id = 1;  // ID 
    string    str = 2;  // str 
}

person.proto

syntax="proto3";
package tutorial;

message Person
{
	string name = 1;
	int32 id = 2;
	string email = 3;

	enum PhoneType
	{
		MOBILE = 0;
		HOME = 1;
		WORK = 2;
	}

	message PhoneNumber
	{
		string number = 1;
		PhoneType type = 2; 
	}

	repeated PhoneNumber phone = 4;
}

message AddressBook
{
	repeated Person person =1;
}

protoc -I=./ --cpp_out=./ helloworld.proto
protoc -I=./ --cpp_out=./ person.proto

 

会自动生成文件:

helloworld.pb.h

helloworld.pb.cc

person.pb.h

person.pb.cc

 

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)

project(pbtest)

#set(SRC .)
#查找当前目录下的所有源文件,并将名称保存到DIR_SRCS变量
aux_source_directory(. DIR_SRCS)

add_executable(${PROJECT_NAME} ${DIR_SRCS})
TARGET_LINK_LIBRARIES(${PROJECT_NAME} protobuf)

 

main.cpp

#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string>
#include <pthread.h>
#include <fstream>
#include "helloworld.pb.h"

using namespace std;
#define BUFFSIZE 1024

int main()
{
    GOOGLE_PROTOBUF_VERIFY_VERSION;

    //eg1, write file
    lm::helloworld msg1;
    msg1.set_id(1001);
    msg1.set_str("hello world");

    fstream output("./log", ios::out | ios::trunc | ios::binary);
    if (!msg1.SerializeToOstream(&output)) {
        cerr << "Failed to write msg." << endl;
        return -1;
    }

    output.close();
    cout << msg1.id() << endl;
    cout << msg1.str() << endl;

    //eg2, read file
    lm::helloworld msg2;
    fstream input("./log", ios::in | ios::binary);
    if (!input)
    {
        cerr << "open file failed!\n";
        return -1;
    }

    if (!msg2.ParseFromIstream(&input)) {
        cerr << "Parse file failed!" << endl;
        return -1;
    }

    input.close();
    cout << msg2.id() << endl;
    cout << msg2.str() << endl;

    //eg3, write buf, protobuf序列化
    lm::helloworld msg3;
    msg3.set_id(1002);
    msg3.set_str("good idea");
    char buf[BUFFSIZE];
    memset(buf, 0, BUFFSIZE);
    msg3.SerializeToArray(buf, BUFFSIZE);

    //eg4, read buf, protobuf反序列化
    lm::helloworld msg4;
    msg4.ParseFromArray(buf, BUFFSIZE);
    cout << msg4.id() << endl;
    cout << msg4.str() << endl;

    // Optional:  Delete all global objects allocated by libprotobuf.
    google::protobuf::ShutdownProtobufLibrary();

    return 0;
}

 

 

编译通过,但是运行时会报错:error while loading shared libraries: libprotobuf.so.15: cannot open shared object file: No such file or directory
此时需要在/etc/ld.so.conf中加入librdkafka.so所在的目录:/usr/local/lib/
然后在终端执行命令,使之生效:
[root@localhost etc]# ldconfig

注意,/usr/local/lib/每次有库文件更新,都需要终端重新运行一次ldconfig这条命令。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值