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.mzph.cn/bicheng/4197.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LLMOps】小白详细教程,在Dify中创建并使用自定义工具

文章目录 博客详细讲解视频点击查看高清脑图 1. 搭建天气查询http服务1.1. flask代码1.2. 接口优化方法 2. 生成openapi json schema2.1. 测试接口2.2. 生成openapi schema 3. 在dify中创建自定义工具3.1. 导入schema3.2. 设置工具认证信息3.3. 测试工具 4. 调用工具4.1. Agent…

docker启动的mysql8中文乱码问题和无法输入中文

问题描述: 1.中文显示乱码 2.无法输入中文 中文乱码临时方案: show variables like ‘character%’; SET NAMES utf8mb4; SET CHARACTER SET utf8mb4; 中文乱码永久方案: vim /etc/my.cnf[client] default-character-setutf8mb4[mysql]…

Linux详解:进程创建

文章目录 进程创建fork函数写时拷贝页表fork常规用法fork调用失败的原因 进程创建 fork函数 在linux 中fork函数&#xff0c;它从已经存在的进程中创建一个新的进程&#xff0c;新进程为子进程&#xff0c;而原进程为父进程。 #include<unistd.h> pid_t fork(void);返…

嵌入式学习58-ARM7(字符设备驱动框架led)

知识零碎&#xff1a; kernel 内核 printk 内核打印 cat /proc/devices insmod …

如何通过安全数据传输平台,保护核心数据的安全传输?

在数字化的浪潮中&#xff0c;企业的数据安全传输显得尤为关键。随着网络攻击手段的日益复杂&#xff0c;传统的数据传输方式已不再安全&#xff0c;这就需要我们重视并采取有效的措施&#xff0c;通过安全数据传输平台来保护核心数据。 传统的数据传输面临的主要问题包括&…

【介绍下IDM的实用功能】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

【已解决】仅当从 VS 开发人员命令提示符处运行 VS Code 时,cl.exe 生成和调试才可用。

当我们在使用vs code运行.c文件时可能会出现如下报错&#xff1a; 这是因为我们使用的生成和调试方式是cl.exe&#xff0c;我们需要更改到gcc.exe。 解决办法&#xff1a; 将所需运行的文件复制粘贴到新的一个文件夹下&#xff0c;此时再点击运行按钮会弹出如下窗口&#xf…

Vue入门到关门之计算属性与监听属性

一、计算属性 1、什么是计算属性 计算属性是基于其它属性计算得出的属性&#xff0c;就像Python中的property&#xff0c;可以把方法/函数伪装成属性&#xff0c;在模板中可以像普通属性一样使用&#xff0c;但它们是基于响应式依赖进行缓存的。这意味着只有在依赖的响应式数…

Mysql 存在多条数据,按时间取最新的那一组数据

1、数据如下&#xff0c;获取每个用户最近的一次登录数据 思路1&#xff1a;order by group by 先根据UserIdLogInTime排序&#xff0c;再利用Group分组&#xff0c;即可得到每个User_Id的最新数据。 1 SELECT * FROM login_db l ORDER BY l.user_id, l.login_time DESC; 排…

基于车载点云数据的城市道路特征目标提取与三维重构

作者&#xff1a;邓宇彤&#xff0c;李峰&#xff0c;周思齐等 来源&#xff1a;《北京工业大学学报》 编辑&#xff1a;东岸因为一点人工一点智能公众号 基于车载点云数据的城市道路特征目标提取与三维重构本研究旨在弥补现有研究在处理复杂环境和大数据量上的不足&#xf…

MFC实现ini配置文件的读取

MFC实现 ini 配置文件的读取1 实现的功能&#xff1a;点击导入配置文件按钮可以在旁边编辑框中显示配置文件的路径&#xff0c;以及在下面的编辑框中显示配置文件的内容。 1. 显示配置文件内容的编辑框设置 对于显示配置文件内容的 Edit Contorl 编辑框的属性设置如下&#x…

绘唐3怎么联系团长299矩阵反推模块使用说明

反推配置说明看这里:团长https://qvfbz6lhqnd.feishu.cn/wiki/D3YLwmIzmivZ7BkDij6coVcbn7W MJ配置说明 如上图 选择公有云,即可体验

Linux计划任务书以及定时任务的编写

一、程序可以通过两种方式执行&#xff1a; 手动执行利用调度任务&#xff0c;依据一定的条件自动执行 自动执行可通过一下两个命令来实现: &#xff08;1&#xff09;At &#xff08;单一工作调度&#xff09; &#xff08;2&#xff09;Cron &#xff08;循环工作调度&a…

求三个字符数组最大者(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <string.h>int main() {//初始化变量值&#xff1b;int i 0;char str[3][20];char string[20];//循环输入3个字符…

Selenium的四种部署方式

关于selenium 的部署&#xff0c;我在网上找了很多&#xff0c;基本上都没有提到或是说的比较清晰的。当时我一直有个困惑&#xff1a;测试的脚本代码&#xff0c;是放在跟浏览器同一台机器上呢&#xff0c;还是放在Application Server上&#xff1f; 在官方开发文档中&#x…

蛋糕购物商城

蛋糕购物商城 运行前附加数据库.mdf&#xff08;或使用sql生成数据库&#xff09; 登陆账号&#xff1a;admin 密码&#xff1a;123456 修改专辑价格时去掉&#xffe5;以及上传专辑图片 c#_asp.net 蛋糕购物商城 网上商城 三层架构 在线购物网站&#xff0c;电子商务系统 …

Kubernetes中文件挂载的四种方式

一. Kubernetes入门 1.1 Kubernetes创建POD过程 1.2. Kubernetes基本操作 命令说明用法create创建kubectl create -f xx.yamledit编辑kubectl edit svc [POD的service名称]get获取kubectl get pod --namespaceXXXpatch更新kubectl patch -f xx.yamldelete删除kubectl delete …

AWTK 开源串口屏开发(17) - 通过 MODBUS 访问数组数据

在 AWTK 串口屏中&#xff0c;内置了 MODBUS Client Channel 的模型&#xff0c;不用编写代码即可实现在 ListView 中显示数组数据。 MODBUS 协议一次只能读取 125 个 WORD&#xff0c;AWTK-MODBUS Client Channel 支持长数据&#xff0c;自动分成多个请求访问。 1. 功能 不用…

【后端】Thymeleaf模板引擎学习笔记

文章目录 1. java体系模板引擎介绍2. 使用2.1 初步使用2.2. 引用静态资源模板2.3 引用静态资源模板(配置资源路径和后缀)2.4 整合springboot 视频地址 1. java体系模板引擎介绍 FreeMarkerThymeleafVelocity 2. 使用 2.1 初步使用 引入依赖 <dependency><groupId>…

C++学习随笔(11)——vector

本章我们来学习一下vector&#xff01; 目录 1.vector的介绍及使用 1.1 vector的介绍 1.2 vector的使用 1.2.1 vector的定义 1.2.2 vector iterator 的使用 1.2.3 vector 空间增长问题 1.2.4 vector 增删查改 1.2.5 vector 迭代器失效问题。 1.vector的介绍及使用 1…