背景:工作中需要使用到 protobuf,看了一些教程,感觉都不是很适合,便自己总结一些

开发环境:

  • Win 10
  • VS2019
  • CMake 3.24.2
  • Protobuf 3.21.12 (Protoc 版本必须于 Protobuf 版本一致)

MinGW 版本的编译在之后有空再研究。

https://stackoverflow.com/questions/9243816/how-to-build-googles-protobuf-in-windows-using-mingw

Update: 2023.09.05

使用 Vcpkg 进行统一包管理

请按照官网文档搭建本地的 vcpkg,or 参考本篇博客:Here

# Poweshell 切换到 vcpkg 根目录下
.\vcpkg install protobuf:x64-windows
.\vcpkg install protobuf:x86-windows # CMakeLists
# 保存可能会有 warning, 不必在意
find_package(protobuf CONFIG REQUIRED)
target_link_libraries(Test PRIVATE protobuf::libprotoc protobuf::libprotobuf protobuf::libprotobuf-lite) # 接下来的操作如出一辙
# 即 使用 proto 生成 .cc .h 文件, main 中调用

前期工作准备

  • 下载 Protobuf

    Protobuf Github 的 Release下载 \(Protobuf\ cpp\) 版本:

    https://github.com/protocolbuffers/protobuf/releases/tag/v21.12

    (注意,最新的版本可能不包含cpp版本,此处选择了版本3.21.12,如果下载最新all版本,按照以下流程走可能会在CMake configure时因为cmake文件夹中缺少CMakeLists.txt而报错。)

    到上述链接找到Protocol Buffers v21.12,下载名为protobuf-cpp-3.21.12.zip文件解压,将文件夹protobuf-3.21.12移动到 D盘 (盘符根据自己实际情况)。

  • 下载 Protoc 并配置环境变量

    protoc是.proto文件的编译器,它可以将.proto文件生成你想要语言对应的类。如果protoc版本和protobuf版本不一致将会导致错误,因此还是到上述官方Repo下载protoc-21.12-win64.zip:

    https://github.com/protocolbuffers/protobuf/releases/tag/v21.12

    下载完毕后解压将其 bin 目录添加至 Path

    # CMD 验证
    $ protoc --version
    libprotoc 3.21.12
  • CMake 下载安装

    本文不涉及,但其操作也很简单,去找到安装包下载即可

    # CMD 验证
    $ cmake --version
    cmake version 3.24.2
    CMake suite maintained and supported by Kitware (kitware.com/cmake).

使用 CMake 生成 Probuf 依赖库(Libs)

  • 打开 CMake GUI (如果熟悉 CMake 命令也可自行编译)

    选择 Probuf 项目位置和编译结果存放位置

  • 点击下方的configure,选择Visual Studio的版本2019以及平台 x64,并点击Finish。

    这里请根据每个人的实际情况选择,

    比如 VS2015、VS2017;

    Win32、X64

  • 如果出现Configuration done则表示配置成功(警告可忽略),

  • 然后点击Generate,没有出错的话会出现如下信息:

    Generating done

    在上述设置过的输出目录 D:/DevFile/protobuf-3.21.12/build 下会出现 protobuf.sln,使用自己选择的IDE版本打开。

    双击打开它,在Solution Explorer中依次找到

    libprotobuf
    libprotoc
    protoc
    # 并右击 Build
    # Key 此处我们在Debug x64模式下
    # 有需要的请切换成 Release x64
    # 或者自己选定的 win32

编译完成以后将在 sln 文件的同级输出目录 Debug 中找到编译成功的 lib 等文件

博主个人将其 CV 到合适的位置

至此,所需的 Protobuf 库就准备好了。


在测试项目中使用 Protobuf

使用 IDE (这里使用 VS2019)中创建一个 C++ 空项目,在其文件夹下新建一个 .proto 文件并命名为 addressbook.proto。 文件内容来自 Google 官网文档:Here

syntax = "proto2";

package tutorial;

message Person {
optional string name = 1;
optional int32 id = 2;
optional string email = 3; enum PhoneType {
PHONE_TYPE_UNSPECIFIED = 0;
PHONE_TYPE_MOBILE = 1;
PHONE_TYPE_HOME = 2;
PHONE_TYPE_WORK = 3;
} message PhoneNumber {
optional string number = 1;
optional PhoneType type = 2 [default = PHONE_TYPE_HOME];
} repeated PhoneNumber phones = 4;
} message AddressBook {
repeated Person people = 1;
}

编译.proto文件

此处使用 .proto 文件编译器 protoc 编译文件以生成相应的类,可供项目使用(ptotoc的安装以及环境变量配置此处未提及)。

# CMD
cd ${项目文件夹路径PWD}
# 生成addressbook.proto相应的类addressbook.pb.h和addressbook.pb.cc在同一目录下
protoc --cpp_out=./ addressbook.proto
# 注意其中的空格代表同目录下生成
# 指令中cpp表示生成C++类,也可替换成python或者java等

由于 VS2019 并不会自动添加文件,需要自己手动添加生成的 .h 和 .cc 文件

设置项目属性

Key:首先保证自己的IDE环境是和编译环境一致,即使用 Debug 模式下 x64

接下来的属性配置也是如此

打开项目属性管理器,在 Debug | x64 右键编辑属性

  • C/C++ -> 代码生成 -> 运行库:使用 多线程调试 DLL(/MDd)
  • C/C++ -> 预处理器 -> 预处理器定义:新增 _SCL_SECURE_NO_WARNINGS
  • 链接器 -> 常规 -> 附加库目录:新增编译得到 Debug 目录(其中有 Libs 文件),D:\Soft\Language\protobuf-3.21.12\VC142\debug
  • 链接器 -> 输入 -> 附件依赖项:新增 libprotobufd.lib

将 Protobuf 安装目录下的 google 文件夹 D:\DevFile\protobuf-3.21.12\src\google 复制到项目文件夹下

为了区分,我放在了 Google

  • C/C++ -> 常规 -> 附加包含目录:新增 D:\Coding\VS2019\Project2\Project2\Google

至此,点击OK项目属性页面就设置完成了。


编写并运行测试代码

// main.cpp
// 代码来源:https://www.cnblogs.com/windsun/p/12543066.html
#include <iostream>
#include <fstream>
#include "addressbook.pb.h" using namespace std; int main(int argc, char** argv) {
tutorial::Person p1;
p1.set_id(1);
p1.set_name("Jerry");
p1.set_email("jerry@mail.com"); // serialization
string resultAfterSerialization;
p1.SerializeToString(&resultAfterSerialization);
cout << "after serialization: " << resultAfterSerialization << endl; tutorial::Person p2;
if (!p2.ParseFromString(resultAfterSerialization)) {
cerr << "failed to parse Person." << endl;
return -1;
}
cout << "after deserialization: " << endl;
cout << "id: " << p2.id() << endl;
cout << "name: " << p2.name() << endl;
cout << "email: " << p2.email() << endl;
}

代码写好以后点击运行即可看到如下输出:

【Protoc】VS2019 (VS平台) 使用 CMake 编译安装、使用 Protobuf 库的更多相关文章

  1. Windows下CMake编译安装OpenCV

    Windows下CMake编译安装OpenCV 这是一个面向新手的在windows上运进opencv, helloword的教程. 在这里我们使用vs2019来编译opencv, 并运行一个hello ...

  2. cmake编译安装mysql 5.6.12

    cmake安装mysql 5.6.12 从mysql 5.5 开始就要用cmake编译安装 下载mysql 下载地址:http://pan.baidu.com/s/1o68xxqE 一.安装mysql ...

  3. CentOS单独编译安装PHP gd库扩展

    注意:如果您已经编译安装过GD库,请重新编译安装php不带gd库成功后,执行以下操作 安装libpng wget http://jaist.dl.sourceforge.net/project/lib ...

  4. 基于cmake编译安装MySQL-5.5

    cmake的重要特性之一是其独立于源码(out-of-source)的编译功能,即编译工作可以在另一个指定的目录中而非源码目录中进行,这可以保证源码目录不受任何一次编译的影响,因此在同一个源码树上可以 ...

  5. CentOS下使用cmake编译安装mysql

    一.下载安装所必需的依赖包 1.因为高版本mysql都用cmake安装,所以下载cmake wget http://www.cmake.org/files/v3.0/cmake-3.0.1.tar.g ...

  6. MySQL分支Percona, cmake编译安装

    Percona是在MySQL基础上改进的,在功能和性能上有着很显著的提升.该版本提升了在高负载情况下的InnoDB的性能,为DBA提供一些非常有用的性能诊断工具:另外有更多的参数和命令来控制服务器行为 ...

  7. Mysql 5.6 Cmake 编译安装

    MySQL编译安装 环境: OS: CentOS 6.6x64 mini mysql: mysql-5.6.251. mysql 下载: http://dev.mysql.com/downloads/ ...

  8. cmake编译安装mysql

    运维开发技术交流群欢迎大家加入一起学习(QQ:722381733) 前言:这里我使用的安装方式是(cmake编译),我选择的版本是:cmake-2.8.8.tar.gz.mysql-5.5.32.ta ...

  9. Centos 6下使用cmake编译安装MariaDB

    写在前面 最近在学习Maria DB,为了方便查阅,又为了将所学的知识重新的梳理,特作此随笔一篇,希望过后阅读时能有所感,也希望对大家能够有所帮助. 安装前的准备 大家都知道,在Linux上安装软件一 ...

  10. [转载~笔记]CentOS单独编译安装PHP gd库扩展

    http://www.nowamagic.net/librarys/veda/detail/2610 安装gd前置库: freetype, jpegsrc, libpng 1. freetypewge ...

随机推荐

  1. CD74HC4067高速CMOS16通道模拟多路复用器实践

    咱们在玩arduino或stm32.esp8266时,有时会遇到板子模拟口不够用的情况,这个时候CD74HC4067就派上用场了,它可以将16路数字/模拟信号通过4数字+1模拟=5口来读取. 这货长这 ...

  2. 时间复杂度为 O(nlogn) 的排序算法

    归并排序 归并排序遵循分治的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后合并这些子问题的解来建立原问题的解,归并排序的步骤如下: 划分:分解待排序的 n 个元素的 ...

  3. ruoyi vue 前后端分离版本 打包分离jar包至lib

    环境:若依前后端分离版本,原打包时将所有的依赖jar包放至ruoyi-admin.jar 包中,该包130MB,过大. 需求:为了减少打包更新上传的时间,减少至1.1mb 1.将不常更新的模块jar包 ...

  4. LangChain内幕指南

    1.概述 在人工智能迅速演进的时代,诸如Open AI的ChatGPT和Google的Bard等大型语言模型(LLMs)正彻底改变我们与技术互动的方式.这些技术巨头和SaaS公司正在竞相利用LLMs的 ...

  5. 用友U8与MES系统API接口对接案例分析

    企业数字化转型:轻易云数据集成平台助力 U8 ERP+MES 系统集成 为什么选择数字化转型? 领导层对企业资源规划(ERP)的深刻理解促使了数字化转型的启动. 采用精确的"N+5" ...

  6. 校园社团活动管理系统(适合小白)基础javaweb前端项目实战【包含增删改查,mysql】一

    校园社团活动管理系统(20分) 1.项目需求: 校园社团作为高校课外活动的重要组成部分,发展十分迅速,也受到越来越多学生的欢迎,社团规模.数量等都在日益增长,社团活动也更为多样和丰富.然而,大多数高校 ...

  7. 全面的.NET微信网页开发之JS-SDK使用步骤、配置信息和接口请求签名生成详解

    JSSDK使用步骤 步骤一:绑定安全域名: 先登录微信公众平台进入"公众号设置"的"功能设置"里填写"JS接口安全域名". 步骤二:引入JS ...

  8. vertx的学习总结7之用kotlin 与vertx搞一个简单的http

    这里我就简单的聊几句,如何用vertx web来搞一个web项目的 1.首先先引入几个依赖,这里我就用maven了,这个是kotlin+vertx web <?xml version=" ...

  9. 又有新框架上线了,测试、AI 通通有「GitHub 热点速览」

    本周热点之一可能就是 Apple 刚开源便获得 8k+ star 的机器学习框架 mlx,顺带官方开源的 mlx-example(示例仓)也在热门榜上有一席之位,据说它已经跑通了大模型 Llama 7 ...

  10. 衡兰芷若成绝响,人间不见周海媚(4k修复基于PaddleGan)

    一代人有一代人的经典回忆,1994年由周海媚.马景涛.叶童主演的<神雕侠侣>曾经风靡一时,周海媚所诠释的周芷若凝聚了汉水之钟灵,峨嵋之毓秀,遇雪尤清,经霜更艳,俘获万千观众,成为了一代人的 ...