当前位置 : 主页 > 大数据 > 区块链 >

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

来源:互联网 收集:自由互联 发布时间:2021-06-22
环境: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 通常情况ProtoBu

环境: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

通常情况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=./ addressbook.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这条命令。
网友评论