0 准备工作:

(1)下载protobuf

​https://github.com/google/protobuf/releases​

protobuf的编译和使用,在windows平台上_解决方案

下载的是cpp版本,选择当前最新版本即可

(2)安装cmake

​https://cmake.org/download/​

protobuf的编译和使用,在windows平台上_#include_02

根据系统选择安装的cmake版本,我这里选择的是64位版本安装。

1 编译protocol

解压刚才下载的protobuf包,打开cmake

protobuf的编译和使用,在windows平台上_当前目录_03

按图所示,1选择protobuf中的cmake目录,2是选择目标目录(生成的工程存放位置),3的点击左下角的configure按钮:

protobuf的编译和使用,在windows平台上_解决方案_04

以vs2015工程为例,上面的一个框是32位版本,下面的Win64是64位版本。以生成32位版本为例,生成64位版本工程操作相同。

protobuf的编译和使用,在windows平台上_当前目录_05

点击finish

protobuf的编译和使用,在windows平台上_#include_06

没有错误,generate按钮变为可用,默认的选项如图,这里就默认生成静态包。

点击generate按钮后,几秒后,Open Project按钮变为可用,打开工程

protobuf的编译和使用,在windows平台上_ios_07

这里可以选择生成Debug版本32位的lib,只生成libprotobuf和protoc即可。

protobuf的编译和使用,在windows平台上_解决方案_08

这3个是我们需要的。

3 测试生成的lib库和protoc.exe工具

(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文件夹(自己新建的文件夹)中。

设置工程:

protobuf的编译和使用,在windows平台上_#include_09

protobuf的编译和使用,在windows平台上_解决方案_10

protobuf的编译和使用,在windows平台上_#include_11

protobuf的编译和使用,在windows平台上_解决方案_12

main.cpp代码:

#include <iostream>
#include <fstream>
#include <string>
#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("mark@example.com");

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平台上_javascript_13

编译过程:

1>------ 已启动全部重新生成: 项目: pbDemo, 配置: Debug Win32 ------
1> person.pb.cc
1> main.cpp
1> 正在生成代码...
1> pbDemo.vcxproj -> D:\VS2015_Project\pbDemo\Debug\pbDemo.exe
1> pbDemo.vcxproj -> D:\VS2015_Project\pbDemo\Debug\pbDemo.pdb (Full PDB)
========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========

运行结果:

protobuf的编译和使用,在windows平台上_当前目录_14

参考:

VS2013编译错误:-D_SCL_SECURE_NO_WARNINGS解决方案:

warning LNK4099: PDB 原因及解决方案: