VC2022 + protobuf

google这是有私心啊,protobuf从某个版本开始,依赖了一个google自己推出的大型组件集,Abseil,有点类似于Boost了,业内用的人,从个人狭窄的圈子来说,应该是不多的,据说google的众贤用的很好。

可是,对于只想白嫖protobuf的笔者来说,protobuf新增对Abseil的依赖,简直是非常麻烦,Abseil 里面包含太多的子组件了,子组件之间的依赖,差点让笔者弃疗。

笔者搞定VC上的protobuf之后,组内伙伴将linux/WSL环境上的protobuf回退到老版本,即不依赖Abseil(需要编译器支持C++17标准,显然ARM上最多支持C++14的交叉编译器搞不定)的那种。

结果现在是双线运行,同一套proto file,默认是用老版本工具生成的 pb.cc/pb.h, VC版本其实仅用于本地,不会在pipeline上跑,每次都是手动再次生成一份。

网上也有部分先吃肉的同行大致介绍了方案。个人也是经历了好几天的折腾,有了一个直接的使用方案,不藏私了,希望对各位小伙伴有帮助。

下载 3.25版本,cmake工具确保已经安装

根据readme ,让你下载abseil你就乖乖照做

有一个命令做了记录,

cmake --no-warn-unused-cli -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -Dprotobuf_BUILD_TESTS=OFF -SE:/protobuf-3.25.0 -Be:/protobuf-3.25.0/build -G "Visual Studio 17 2022" -T host=x86 -A win32

一番折腾后,sln打开如下(vcpkg工具的先可以不用看,个人是没有走通这条道,浪费了很多时间)

庞大的Abseil 工程让人望而生畏,一路修改各个子项目属性

该编译就编译,有高手将Abseil整成了一个静态库而不是众多原生的静态库集合,这个要表示佩服一下。

Abseil编译的结果如下

附带的utf8_range如下

protobuf有关的工具和库如下

然后的,这些库要用起来

Abseil的库,放到工程子目录 absl下

Protobuf和Abseil的头文件没有好好整理,子项目 Emulator的文件包含路径有了如下两项,

Emulator_ut 是 单元测试专用工程

附加库目录这里其实没有填完整,但是也不是必须

看看链接器的输入项,最有决定性的开始来了

完全展开后

gmock.lib
gmock_main.lib
gtest.lib
gtest_main.lib
jsoncpp_static.lib
libprotobufd.lib
utf8_range.lib
utf8_validity.lib
../absl\base\Debug\absl_base.lib
../absl\strings\Debug\absl_cord.lib
../absl\log\Debug\absl_die_if_null.lib
../absl\flags\Debug\absl_flags.lib
../absl\hash\Debug\absl_hash.lib
../absl\log\Debug\absl_log_initialize.lib
../absl\base\Debug\absl_log_severity.lib
../absl\status\Debug\absl_status.lib
../absl\status\Debug\absl_statusor.lib
../absl\strings\Debug\absl_strings.lib
../absl\synchronization\Debug\absl_synchronization.lib
../absl\time\Debug\absl_time.lib
../absl\log\Debug\absl_log_internal_check_op.lib
../absl\debugging\Debug\absl_leak_check.lib
../absl\log\Debug\absl_log_internal_conditions.lib
../absl\log\Debug\absl_log_internal_message.lib
../absl\log\Debug\absl_log_internal_nullguard.lib
../absl\debugging\Debug\absl_examine_stack.lib
../absl\log\Debug\absl_log_internal_format.lib
../absl\log\Debug\absl_log_internal_proto.lib
../absl\log\Debug\absl_log_internal_log_sink_set.lib
../absl\log\Debug\absl_log_sink.lib
../absl\log\Debug\absl_log_entry.lib
../absl\log\Debug\absl_vlog_config_internal.lib
../absl\log\Debug\absl_log_internal_fnmatch.lib
../absl\flags\Debug\absl_flags_internal.lib
../absl\flags\Debug\absl_flags_marshalling.lib
../absl\flags\Debug\absl_flags_reflection.lib
../absl\flags\Debug\absl_flags_config.lib
../absl\flags\Debug\absl_flags_program_name.lib
../absl\flags\Debug\absl_flags_private_handle_accessor.lib
../absl\flags\Debug\absl_flags_commandlineflag.lib
../absl\flags\Debug\absl_flags_commandlineflag_internal.lib
../absl\log\Debug\absl_log_globals.lib
../absl\log\Debug\absl_log_internal_globals.lib
../absl\container\Debug\absl_raw_hash_set.lib
../absl\hash\Debug\absl_city.lib
../absl\hash\Debug\absl_low_level_hash.lib
../absl\container\Debug\absl_hashtablez_sampler.lib
../absl\strings\Debug\absl_cordz_info.lib
../absl\strings\Debug\absl_cord_internal.lib
../absl\strings\Debug\absl_cordz_functions.lib
../absl\profiling\Debug\absl_exponential_biased.lib
../absl\strings\Debug\absl_cordz_handle.lib
../absl\crc\Debug\absl_crc_cord_state.lib
../absl\crc\Debug\absl_crc32c.lib
../absl\crc\Debug\absl_crc_internal.lib
../absl\crc\Debug\absl_crc_cpu_detect.lib
../absl\types\Debug\absl_bad_optional_access.lib
../absl\base\Debug\absl_strerror.lib
../absl\strings\Debug\absl_str_format_internal.lib
../absl\debugging\Debug\absl_stacktrace.lib
../absl\debugging\Debug\absl_symbolize.lib
../absl\debugging\Debug\absl_debugging_internal.lib
../absl\debugging\Debug\absl_demangle_internal.lib
../absl\synchronization\Debug\absl_graphcycles_internal.lib
../absl\synchronization\Debug\absl_kernel_timeout_internal.lib
../absl\base\Debug\absl_malloc_internal.lib
../absl\strings\Debug\absl_strings_internal.lib
../absl\strings\Debug\absl_string_view.lib
../absl\base\Debug\absl_spinlock_wait.lib
../absl\base\Debug\absl_throw_delegate.lib
../absl\numeric\Debug\absl_int128.lib
../absl\time\Debug\absl_civil_time.lib
../absl\time\Debug\absl_time_zone.lib
../absl\types\Debug\absl_bad_variant_access.lib
../absl\base\Debug\absl_raw_logging_internal.lib
%(AdditionalDependencies)

不用感叹添加这些目录费了多少时间。

使用protobuf的时候,可以用编译出来的protoc.exe,也可以用下载版本的,随意。

笔者将 如下目录放置到环境变量path中的时候,还将include整理了一番,之前编译Emulator的时候时候总是提示缺这缺那。

将proto file转化为 c++代码

 protoc.exe -I=D:\work\...\Emulator\proto --cpp_out=D:\work\...\Emulator\src *.proto

然后么,添加到Emulator工程中

搞定,后续看看有什么遗漏的,需要的话可以补充。

我们当前用的都是protobuf的比较基础的特性,序列化和反序列化,json互转。

差点忘了,补充一下,新版本的protoc工具生成的文件中(看起来就是原生文件),VC2022下编译不过,如下这个网页中有描述,并且提问者还给出了一个临时解决方案(用老的protoc的就木有问题)

kVTable': redefinition; different storage class

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/579185.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【UnityRPG游戏制作】RPG项目的背包系统商城系统和BOSS大界面

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

【C++】简易二叉搜索树

目录 一、概念: 二、代码实现: 大致结构: 1、遍历: 2、insert 3、find 4、erase 三、总结: 一、概念: 二叉搜索树又称为二叉排序树,是一种具有特殊性质的二叉树,对于每一个节…

springboot+springsecurity+vue前后端分离权限管理系统

有任何问题联系本人QQ: 1205326040 1.介绍 优秀的权限管理系统,核心功能已经实现,采用springbootvue前后端分离开发,springsecurity实现权限控制,实现按钮级的权限管理,非常适合作为基础框架进行项目开发。 2.效果图…

ICP点云配准初探

ICP点云配准初探 1 简介2 常用的点云配准算法3 ICP(Iterative Closest Point,最近点迭代法)3.1 ICP要解决的问题3.2 ICP的核心思想3.3 算法流程3.4 总结 4 ICP优缺点 1 简介 在逆向工程,计算机视觉,文物数字化等领域中…

香港BTC、ETH现货ETF同时通过,对行业意义几何?

香港比美国更快一步通过以太坊现货 ETF。 2024 年 4 月 15 日,香港嘉实国际资产管理有限公司(Harvest Global Investments)今天宣布,得到香港证监会的原则上批准,将推出两大数字资产(比特币及以太坊&#…

​可视化大屏C位图:园区鸟瞰

将园区鸟瞰图作为可视化大屏设计的焦点图有以下几个好处: 提供全局视图:园区鸟瞰图可以展示整个园区的布局和结构,提供全局视图。这对于大型园区或复杂的场所来说尤为重要,用户可以一目了然地了解整个园区的规模、分布和关联关系…

go设计模式之工厂方法模式

工厂方法模式 什么是工厂方法模式 工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化推迟到其子类。 这个接口就是工厂接口,子类就是具体工厂类,而需要创…

频率分析和离散傅里叶变换——DSP学习笔记四

背景知识 四种基本的傅里叶变换 基本思想:将信号表示为不同频率 正弦分量的线性组合 正弦信号和复指数时间信号的有用特性 相同频率但不同相位的正弦信号的任何线性组合,都是有着相同频率但不同相位,且幅度可能受改变的正弦信号。 复指数时…

EXCEL表格中的数字,为什么每次打开会自动变成日期?

一、典型现象 在工作中,有时会发现公司里的报表,经过多人多次的重复的使用和修改后,会出现这种情况: 1.在表格里按照需要输入数字,保存工作簿。 2.然而,再次打开工作簿,里面的数字变成日期&a…

Linux多线程(二) 线程同步 信号量互斥锁读写锁条件变量

多个进程同时访问某些资源时,必须考虑同步问题,以确保任一时刻只有一个进程可以拥有对资源的独占式访问。通常,程序对关键资源的访问代码只是很短的一段,我们称这段代码为关键代码段或者临界区,对进程同步,…

火绒安全概述

页面简介: 火绒安全是一款集多种安全功能于一体的国产软件,旨在为用户提供全面的计算机保护。本页面将详细介绍火绒安全的核心功能和使用方式。 页面内容概览: 杀毒防护 实时监控:详细介绍火绒安全如何实时检测系统中的文件和程序…

【强训笔记】day5

NO.1 思路&#xff1a;找到数量最小的字符&#xff0c;就可以知道you的数量&#xff0c;用o的数量减去you的数量再减去1就是oo的数量。 代码实现&#xff1a; #include<iostream>using namespace std;int main() {int q;cin >> q;int a, b, c;while (q--){cin &g…

Java web应用性能分析之【sysbench基准测试】

Java web应用性能分析之【CPU飙高分析之MySQL】-CSDN博客 Java web应用性能分析之【Linux服务器性能监控分析概叙】-CSDN博客 Java web应用性能分析概叙-CSDN博客 Java web应用性能分析之【基准测试】-CSDN博客 上面基本科普了一下基准测试&#xff0c;这里我们将从sysbench…

雷电模拟器,安卓手机模拟器电脑端去广告精简优化版 v9.0.70 (240427)

软件介绍 在众多安卓模拟器中&#xff0c;雷电模拟器作为电脑端手游的首选平台&#xff0c;由上海畅指网络科技有限公司研发并免费提供给用户。此模拟器搭载了先进的内核技术&#xff08;基于版本&#xff09;&#xff0c;确保了软件运行的高速性和稳定性。雷电模拟器还引入了…

【yolov8yolov5驾驶员抽烟-打电话-喝水-吃东西检测】

YOLO算法DMS驾驶员抽烟-打电话-喝水-吃东西检测数据集 YOLOv8和YOLOv5是深度学习中用于目标检测的先进算法&#xff0c;它们在实时性和准确性方面表现出色&#xff0c;适用于各种视频监控和图像处理应用&#xff0c;包括驾驶员行为监测。这些算法通过单次前向传播即可预测图像…

javaScript基础2

javaScript 一.运算符二.流程控制1.顺序流程控制2.分支流程控制&#xff08;1&#xff09;if/if..else/if多分支&#xff08;2&#xff09;.三元表达式&#xff08;4&#xff09;.switch和if else区别 3.循环流程控制(1).for循环/双重for循环(2).一些例子(3).while循环/do..whi…

SpringBoot 接口防抖(防重复提交)的一些实现方案

啥是防抖 所谓防抖&#xff0c;一是防用户手抖&#xff0c;二是防网络抖动。 在Web系统中&#xff0c;表单提交是一个非常常见的功能&#xff0c;如果不加控制&#xff0c;容易因为用户的误操作或网络延迟导致同一请求被发送多次&#xff0c;进而生成重复的数据记录。 要针对…

【C++ | 复合类型】结构体、共用体、枚举、引用

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a; 本文未经允许…

深入理解冯诺依曼体系结构

文章目录 冯诺依曼体系结构概念冯诺依曼体系结构的优势冯诺依曼体系结构的现实体现 冯诺依曼体系结构概念 冯诺依曼体系结构也称普林斯顿结构&#xff0c;是现代计算机发展的基础。它的主要特点是“程序存储&#xff0c;共享数据&#xff0c;顺序执行”&#xff0c;即程序指令和…

芋道微服务功能介绍(限免)

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 系列文章目录 第一章 芋…