使用的版本:protobuf-3.19.1
环境:vs2017,cmake3.18.1
java和c#的好弄,但要生成C++,你得生成libprotobuf.lib
一、使用CMake编译
官方教程:protobuf/README.md at master · protocolbuffers/protobuf · GitHub
1.下载源码protobuf-cpp-3.19.1.zip
2.编译
//开始之前要下载protobuf-3.19.1 cpp版,Cmake,vs2017
//用这个控制台 以管理员运行x86 Native Tools Command Prompt for VS 2017 不要用cmd
//复制并解压protobuf-3.19.1到D:\009protobuff\to下
//新建输出目录
D:\009protobuff\to>mkdir install
//新建编译目录
D:\009protobuff\to\protobuf-3.19.1\cmake>mkdir build & cd build
//以下编译为release,改为debug就是生成debug,为每个配置构建一个单独的文件夹。
D:\009protobuff\to\protobuf-3.19.1\cmake\build>mkdir release & cd release
copy D:\009protobuff\to\protobuf-3.19.1\cmake\CMakeLists.txt D:\009protobuff\to\protobuf-3.19.1\cmake\build\release\
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -Dprotobuf_BUILD_TESTS=OFF ../..
//提示Could NOT find ZLIB (missing: ZLIB_LIBRARY ZLIB_INCLUDE_DIR)没关系
//新建解决方案目录 Visual Studio 15 2017 Win64这个字段可以用cmake --help来看
cd D:\009protobuff\to\protobuf-3.19.1\cmake\build
D:\009protobuff\to\protobuf-3.19.1\cmake\build>mkdir solution & cd solution
//生成VS工程
D:\009protobuff\to\protobuf-3.19.1\cmake\build\solution>cmake -G "Visual Studio 15 2017 Win64" -DCMAKE_INSTALL_PREFIX=../../../../install ../..
//编译VS工程,或用visual studio 2017打开编译也行
D:\009protobuff\to\protobuf-3.19.1\cmake\build\release>nmake
//编译完成后,将编译好的文件生成到安装目录
D:\009protobuff\to\protobuf-3.19.1\cmake\build\release>nmake install
//在install目录下lib和include复制到你项目下,不复制直接使用路径到这里也行。
没报错就是成功。安装完成后,里面会有:
-
bin
-包含了protoc.exe,用来把.proto文件编译成各种语言的文件 -
include
-C++头文件目录以及一些.proto文件 -
lib
-生成的库文件
到这里就安装完成了
二、 在VS中使用Protobuf
1.编写.proto文件
people.proto3
syntax = "proto3"; // PB协议版本
package demo; //包名,其他 proto 在引用此,使用 import demo来使用
option java_package = "com.xhrrj.protobuf"; // java生成类的包名,注意:会在指定路径下按照该包名的定义来生成文件夹
option java_outer_classname="PeopleClass"; // java生成类的类名,注意:下划线的命名会在编译的时候被自动改为驼峰命名
message People {
string name = 1;
int32 id = 2;
string email = 3;
}
2.编译生成java文件 C#、CPP或其它语言
生成 (protoc.exe是上面solution里编译出来的,再加路径到path里,也可以直接从github下载)
protoc --proto_path=D:\009protobuff\demo --java_out=D:\009protobuff\demo\out people.proto3
protoc --proto_path=D:\009protobuff\demo --cpp_out=D:\009protobuff\demo\out people.proto3
protoc --proto_path=D:\009protobuff\demo --csharp_out=D:\009protobuff\demo\out people.proto3
3.使用
其它语言都好用。C++真多坑!!!!!!!!!!!!!!!!!!!!!!!
三、C++ 使用
我degub和release都生成了。
直接引用
#include "ftsdk_win/SdkInterface.h"
#pragma comment(lib,".\\ftsdk_win\\ftsdk_win.lib")
$(SolutionDir)\protobufdebug\include
$(SolutionDir)\protobufdebug\lib
添加现有项
库和头文件
#include "D:\009protobuff\demo\javaout\addressbook.pb.h"
#pragma comment(lib, "libprotobufd.lib")
C++源码
需加上库,包含目录
// ConsoleApplicationProtobuf.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include "D:\009protobuff\demo\javaout\people.proto3.pb.h"
#pragma comment(lib, "libprotobufd.lib")
using namespace std;
int main()
{
demo::People p;
p.set_id(123);
p.set_name( "chenhao");
p.set_email("11@qq.com");
string data;
p.SerializeToString(&data);
demo::People pNew;
pNew.ParseFromString(data);
cout << "People: " << endl;
cout << "Name: " << p.name() << endl;
cout << "ID: " << p.id() << endl;
cout << "Email: " << p.email() << endl;
cout << "Hello World!\n";
// Optional: Delete all global objects allocated by libprotobuf.
google::protobuf::ShutdownProtobufLibrary();
return 0;
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
// 入门使用技巧:
// 1. 使用解决方案资源管理器窗口添加/管理文件
// 2. 使用团队资源管理器窗口连接到源代码管理
// 3. 使用输出窗口查看生成输出和其他消息
// 4. 使用错误列表窗口查看错误
// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
四、java使用
需加上库
<dependencies>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.19.1</version>
</dependency>
</dependencies>
package main;
import com.google.protobuf.InvalidProtocolBufferException;
import com.xhrrj.protobuf.PeopleClass.People;
public class Main {
public static void main(String[] arg) throws InvalidProtocolBufferException {
People p= People.newBuilder().setName("chenhao").setId(9527).build();
System.out.println(p);
People pNew=People.parseFrom(p.toByteArray());
System.out.println(pNew);
}
}
五、C#使用
需加上库
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleAppCsharpprotobuf
{
class Program
{
static void Main(string[] args)
{
Demo.People p=new Demo.People();
p.Id = 9527;
p.Name = "chenhao";
p.Email = "11@qq.com";
Demo.People pNew = new Demo.People();
pNew.MergeFrom(p);
Console.WriteLine("New People");
Console.WriteLine(pNew.Id);
Console.WriteLine(pNew.Name);
Console.WriteLine(pNew.Email);
Console.ReadKey();
}
}
}