Google protocol buffer的配置和使用(Linux&&Windows)


最近自己的服務器做到序列化這一步了,在網上看了下,序列化的工具有boost 和google的protocol buffer,

protocol buffer的效率和使用程度更高效一些,就自己琢磨下把他加到自己的服務器里。

所以這里我先弄一個小的demo去測試如何使用和配置protocol buffer

首先是windows 平台

windows下protocol buffer 配置:

1 下載protocol buffer, 去google官網或者其他渠道下載protocol buffer包

2 解壓zip文件,進入vs文件夾編譯protocol buffer,圖示如下

 

3 工程下的幾個項目都編譯一遍,會生成幾個lib

 

 在vs目錄下的debug目錄里能看到

protoc.exe 和 libprotobuf.lib,  libprotobuf-lite.lib , libprotoc.lib這幾個lib是新生成的,先放一放,以后會用到。

 到此為止,google protocol buffer的配置和庫已經生成,我們下一步設計自己的proto文件,並生成對應的pb.h和pb.cc

 4編寫自己的proto 格式如下

package smart;

message test
{
    required string name = 1;  
    required int32 age = 2;  
    optional string email = 3;  

}

 

package 表示聲明為包名,package smart;表示包名為smart

message test定義一個消息體,花括號結束不需要分號

括號內是成員變量,成員變量后面的數字默認從1開始,依次遞增。 required表示這個字段必須有,

optional表示字段可選,還有一些repeated表示可重復的值域,常用於數組。

總結下:

 

數據結構體:  

  message message_name{message_body;}  

      message_body格式:  

  例如

  required int32 query = 1[defaut=10]; 

  形式為:rule type name = value[other_rule]; 規則:
  required表示必須具有該值域;
  optional表示可選的值域;
  repeated表示可重復的值域(即>=0);
  其中requered/optional是常用rule,而repeated則不常用同時因為是歷史遺留現使用repeated int32 samples=4[packed=true];形式;
  value值:
  value值最小為1,是底層編碼時使用其中1-15占一位,>15則會占多位;
  不同的message中的value值互不干擾,常以1開始計數。

 


5保存為包名.消息名.proto的形式,我保存為smart.msg.proto

6接下來進行編譯這個smart.msg.proto, protobuf提供了protoc命令

protoc --proto_path=(.proto文件路徑) --cpp_out=(.cc .java生成文件路徑) (.proto文件路徑)/?.proto

--proto_path 簡化為: -I
其中可根據需要更改:cpp_out選項為java_out/python_out。

舉例: protoc -I=./ --cpp_out=./ ./smart.msg.proto

windows環境下打開cmd,進入到protocol buf vs目錄里debug文件夾里調用protoc命令

我的proto放在D:\win32projects\protobuftest\ProtoBuf目錄,所以如下:

 

進入D:\win32projects\protobuftest\ProtoBuf下可看到新生成的文件

 

 

到目前為止,准備工作都做完了,下一步建立自己的項目,使用這些.h和.cc

7建立vs項目,我命名為protobuftest,在項目目錄里建立Include和Lib,Protobuf

文件夾,將protobuff庫的src文件夾拷貝到Include里,將libprotobuf.lib,  

libprotobuf-lite.lib , libprotoc.lib拷貝到Lib文件里,將smart.msg.proto拷貝到Protobuf中,

將protobuff庫的那個debug也拷貝到Protobuf中,因為我想通過寫一個批處理文件在該項目

里生成.h和.cc文件。

Lib文件夾:

 

Include文件夾: 

 

 Protobuf文件夾:

 

 bat如下:

 

cd .\Debug
protoc -I=..\ --cpp_out=..\ ..\smart.msg.proto
pause

 

 

 8 將ProtoBuf文件夾里的.h和.cc添加到項目里

 

 

 

 配置項目屬性C/C++ ----> General --->  Additional Include Directories  ..\Include\src

Linker--->General ----> Additional Library Directories  ..\Lib

 

 

 

 

順便把預編譯也關了

 

9項目配置好后寫代碼:

 

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include "../ProtoBuf/smart.msg.pb.h"
#pragma comment(lib, "libprotobuf.lib")  
#pragma comment(lib, "libprotoc.lib")

int _tmain(int argc, _TCHAR* argv[])
{
    smart::test msg1; 
    msg1.set_age(101); 
    msg1.set_name("nice to meet you!");
    std::fstream out("User.pb", std::ios::out | std::ios::binary | std::ios::trunc);  
    msg1.SerializeToOstream(&out);  
    out.close(); 

    smart::test msg2;  
    std::fstream in("User.pb", std::ios::in | std::ios::binary);  
    if (!msg2.ParseFromIstream(&in)) {  
        std::cerr << "Failed to parse User.pb." << std::endl;  
        exit(1);  
    }  

    std::cout << msg2.age() << std::endl;  
    std::cout << msg2.name() << std::endl; 
    std::cout << msg2.email() << std::endl;
    std::cout << "adfdf" <<std::endl;


    getchar();
    return 0;
}

 

 

 

 測試輸出

 

到此為止windows環境配置和使用google protocol buffer已經解決。下面是Linux環境配置和使用:

1解壓編譯配置,敲命令就可以了:

 

unzip protobuf-2.6.1 
cd protobuf-2.6.1 ./configure --prefix=/usr/local/protobuf-2.6.1 make make check make install

 

 

 

 

2寫proto文件和編譯,跟上面的相同:

3 連帶.cc文件一同編譯,生成目標並執行,以后會寫成makefile,這只是個測試程序,就簡單測試下

記得編譯時帶上-lpthread 和-lprotobuf

 

 

 如果運行時提示找不到libprotobuf9.so這個庫,可以敲這個命令

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

 

到此為止就完成了google protobuf的 學習和配置,謝謝關注我的微信公眾號:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM