vs使用protobuf的各种坑

最近准备做一个即时通讯系统的客户端与服务端,选用protobuf作为TCP之上网络传输的协议,服务端使用的是Go语言,Go语言的protobuf使用起来很舒服很愉悦。客户端使用的是vs + qt,但是在安装protobuf的过程中遇到了各种坑爹的东西,特此记录下来。下面讲解windows安装protobuf并在vs中使用它,以及各种坑。

1、下载protobuf和cmake

protobuf下载地址:https://github.com/protocolbuffers/protobuf/releases/tag/v3.17.2

下载完成后,解压目录。然后下载cmake,cmake是用来编译protobuf的

cmake下载地址:https://cmake.org/download/

2、编译protobuf

打开cmake,按下面步骤操作:

第一步:选择解压后的protobuf下的cmake文件夹

第二步:选择一个存放编译文件的目录,需要自己创建一个

第三步:点击configure

在这里插入图片描述

 
点击configure之后,会弹出一个对话框。在对话框中选择vs的版本以及编译的平台为x64,一定要选择自己安装的vs的版本,否则会找不到,我的vs版本为2019。然后点击Finish。之后软件就会自动进行配置。

在这里插入图片描述

配置完成后,点击generate,然后点击open project按钮。然后就会在vs中打开项目。

在这里插入图片描述

 

在libprotobuf和protoc两个解决方案上分别右键点击生成。

在这里插入图片描述

打开编译好的文件所在的文件夹,就是cmake中第二个指定的路径。生成的库文件和和可执行文件都在Debug目录下:

在这里插入图片描述

最好创建一个protobuf的目录用来存放可执行文件、库文件以及头文件。自己找个合适的位置创建一个protobuf文件,在protobuf文件中创建三个文件夹,分别为bin、lib、include。将生成的库以及可执行文件拷贝到bin目录中:

在这里插入图片描述

然后将bin中的.lib以及.dll文件拷贝到lib目录下:

在这里插入图片描述

最后将下载解压的文件中src目录下的google文件夹拷贝到include文件夹中。

在这里插入图片描述

为了使用方便,可以将bin目录添加到环境变量中:

在这里插入图片描述

3、在VS中使用protobuf

创建一个vs 工程。写一个protobuf的文件:

文件名为:user.proto

syntax="proto2";

package mypb;

message User {
    string username = 1;
    string password = 2;
    string private_ip = 3;
}

然后使用命令生成C++文件:

protoc --cpp_out=. *.proto

# 参数说明:
--cpp_out=.  表示生成的C++文件的存放位置为当前文件
*.proto     表示将当前文件夹下的所有.proto文件编译

 
编译后生成了user.pb.h 和 user.pb.cc

将生成的.cc和.h文件添加到vs中。右击头文件或源文件选择添加/现有项即可添加。

添加之后可以看到里面一大片爆红,原因是找不到头文件。
在这里插入图片描述

因此需要在项目中添加头文件的包含目录以及库文件的目录:

首先,先说一个大坑,这个坑浪费了我半天时间,由于编译protobuf时,选择的平台是x64,因此在vs中也要将项目改为x64的,否则大概率无法运行。

在这里插入图片描述

先将include文件夹以及lib文件夹拷贝当当前工程目录下。

然后在解决方案上右击选择属性,

在这里插入图片描述

1、添加头文件目录

在这里插入图片描述

2、添加库文件目录

在这里插入图片描述

3、添加库文件

在这里插入图片描述

添加完成上面配置后,在user.pb.h头文件中引用的google等头文件就不会报错了,但是里面很可能还有其它的一些宏会报错,这个不用管他。

在main函数中写上测试代码:

#include <iostream>
#include <string>
#include "user.pb.h"


int main()
{
	std::cout << "hello,world!" << std::endl;

	mypb::User user;
	user.set_username("root");
	user.set_password("rootroot");
	user.set_private_ip("192.168.226.186:6666");
	std::string data = user.SerializeAsString();
	std::cout << data << std::endl;

	mypb::User newUser;
	newUser.ParseFromString(data);
	std::cout << newUser.password() << " " << newUser.username() << " " 
	          << newUser.private_ip() << std::endl;

	return 0;
}

然后让你愉快地去运行代码地时候你会发现,报了一大堆错误。无法解析外部命令什么的。

这就是第二个坑了,这时需要在生成的pb.h文件中添加一个宏:

#define PROTOBUF_USE_DLLS

这时便可愉快地运行了。

在这里插入图片描述

其实在配置的时候,不止这些坑,光protobuf的版本我都来来回回下载测试了好几个。

不得不说,C++使用一个他人的库简直麻烦的要死,又要下载又要编译又要配置。就这些步骤烦都把人烦死了,不像Java,只需要在maven中导入一个坐标就可以愉快地使用了,也不像Go一样,只要import相应的包的github地址,一句 go mod tidy命令就解决了。

Protobuf,全称为Protocol Buffers,是由Google设计和维护的一种数据序列化协议。它提供了一种结构化的数据存储格式,并允许跨语言传输数据。在软件开发中,尤其是涉及到客户端和服务端交互的应用场景下,Protobuf非常受欢迎。以下是关于在Visual StudioVS)中使用Protobuf的一些基本介绍和步骤: ### 为什么使用 Protobuf? 1. **简洁明了的数据表示**:Protobuf使用一种轻量级的数据描述语言来定义数据的结构,生成的二进制数据紧凑且易于解析。 2. **高效的性能**:Protobuf序列化的数据比JSON更快,因为它是一种二进制格式而不是文本格式。 3. **跨语言兼容性**:生成的代码可以在多种编程语言中使用,包括C++、Python、Java、JavaScript等。 4. **易于更新和扩展**:修改数据模型时,只需编辑定义文件,无需修改实际的序列化代码。 ### 在 Visual Studio使用 Protobuf #### 步骤 1:安装 Protobufprotoc 工具 - 首先,你需要从 Protobuf 官方网站下载适合你操作系统的安装包。 - 安装完成后,在系统环境变量中添加 Protobuf 的 bin 目录路径。 #### 步骤 2:创建 Protobuf 协议缓冲区文件 1. 打开 VS,新建一个 C++ 或者 Java 项目,或者是一个空的解决方案。 2. 创建一个新的 .proto 文件。在文件中,你可以定义消息(Message)、枚举(Enum)、服务(Service)等各种元素。 ```proto syntax = "proto3"; package example; message MessageExample { string field1 = 1; int32 field2 = 2; } ``` #### 步骤 3:生成代码 - 在项目目录下打开命令提示符(或终端),导航到包含 .proto 文件的位置。 - 使用 `protoc.exe` 命令加上对应的语言插件参数来生成代码。例如,假设你想为 C++ 生成代码: ``` protoc -I=. --cpp_out=. ``` 如果你是使用 Python 插件: ``` protoc -I=. --python_out=. ``` #### 步骤 4:使用生成的代码 现在,在你的项目中包含了生成的代码文件。你可以在 C++ 项目中像使用普通类一样使用这些类,在 Python 或 Java 等其他语言中也是一样,只是语法略有不同。 ### 相关问题: 1. **如何优化 Protobuf 生成的代码大小?** 2. **如何处理 Protobuf 模型更改导致的现有代码冲突?** 3. **如何选择合适的语言插件来与你的项目一起工作?**
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值