protobuf C++ 使用Cmake编译protobuf-3.19.1 专题 Java C#示例 VS2017

使用的版本: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();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小黄人软件

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值