天天看點

我個人的protobuf-3.5.2實踐:安裝與測試

環境: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/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這條指令。

繼續閱讀