protobuf的编译和使用【Windows平台】

一、简介

  • protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。

二、优点

  • Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。
  • 你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏由旧数据结构编译的已部署程序。

三、前期准备

1.下载protobuf

  • 下载地址:https://github.com/protocolbuffers/protobuf/releases/tag/v3.20.0-rc1, 选择当前最新版本下载即可。
    protobuf的编译和使用【Windows平台】_第1张图片

2. 安装CMake

  • 下载地址: https://cmake.org/download/,选择当前版本下载即可。

protobuf的编译和使用【Windows平台】_第2张图片

四、编译Protobuf

1.配置CMake

  • cmake-3.23.0-rc2-windows-x86_64.msi进行默认安装完成,然后运行cmake-gui.exe。

  • 在"1"处选择protobuf源码解压目录,后缀为cmake;

  • 在"2"处选择编译输出目录;

  • 然后选择Configure。
    protobuf的编译和使用【Windows平台】_第3张图片

  • 弹出生成器选择窗口,我们选择"Visual Studio 15 2017"与"x64",然后点击"Finish"。
    protobuf的编译和使用【Windows平台】_第4张图片

  • Configure完成后下方提示:“Configuring done”。

  • 然后,我们选择"Generate",为protobuf源码生成VS工程文件。注意:勾选"protobuf_BUILD_SHARED_LIBS",表示生成动态库;默认不勾选,生成静态库

  • Generate完成后下方提示:“Generating done”。

  • 然后,我们选择"Open Project",打开源码。
    protobuf的编译和使用【Windows平台】_第5张图片

2.编译protobuf

  • 在VS中编译libprotobuf,protoc这2个项目。
    protobuf的编译和使用【Windows平台】_第6张图片

  • 生成libprotobufd.lib、libprotocd.lib、protoc.exe。
    protobuf的编译和使用【Windows平台】_第7张图片

五、简单使用

1.新建一个person.proto的文本文件

package tutorial;

message Person {
  required int32 id = 1;
  required string name = 2;
  optional string email = 3;
}
  • tutorial是包名(也可以说是命名空间),没有第一行的话,就是没有命令空间的。
  • 将protoc.exe和person.proto放在同一个文件夹下,再添加一个批处理文件build.bat,内容为:
protoc --cpp_out=./ person.proto
  • 双击批处理文件build.bat,会在当前目录下生成:person.pb.h和person.pb.cc文件,将其添加到下面的vs工程中。

2.建立一个win32控制台程序的工程

  • protobuf-3.6.1\src\google\protobuf这个目录中的头文件(其余的文件可以删除,也可以保留,不影响),都拷贝过来,放在当前工程下,建立一个include文件夹,把这些.h头文件放进去(文件夹名自己定)。

  • 生成的libprotobufd.lib也拷贝过来,放在当前目录下的lib文件夹(自己新建的文件夹)中。
    具体使用可参考:vs 中的lib 和 dll创建和使用

  • main.cpp代码:

#include 
#include 
#include 
#include "person.pb.h"

using namespace std;

int main(int argc, char* argv[])
{
	GOOGLE_PROTOBUF_VERIFY_VERSION;

	tutorial::Person person;

	//将数据写到person.pb文件
	person.set_id(123456);
	person.set_name("Mark");
	person.set_email("[email protected]");

	fstream out("person.pb", ios::out | ios::binary | ios::trunc);
	person.SerializeToOstream(&out);
	out.close();


	//从person.pb文件读取数据
	fstream in("person.pb", ios::in | ios::binary);
	if (!person.ParseFromIstream(&in)) {
		cerr << "Failed to parse person.pb." << endl;
		exit(1);
	}

	cout << "ID: " << person.id() << endl;
	cout << "name: " << person.name() << endl;
	if (person.has_email()) {
		cout << "e-mail: " << person.email() << endl;
	}

	getchar();
	return 0;
}

这两个生成的文件要记得添加到工程中
protobuf的编译和使用【Windows平台】_第8张图片

运行结果:
在这里插入图片描述

你可能感兴趣的:(Protobuf,windows,visual,studio,c++)