VC2022 + protobuf

news2024/11/18 3:20:38

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.coloradmin.cn/o/1629943.html

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

相关文章

远程连接docker,实现本地发布版本到服务器

最近在学jenkins的时候,发现涉及到了docker的远程发布调用。后续应该还要自己搭建一个docker的本地仓库。 简单描述一下具体是如何实现的: 1、将docker的服务器开启2375端口(注意,这里的开启是将端口直接暴露出去,不用…

适用于芯片行业的开发及管理工具:版本控制、持续集成、代码分析及项目管理工具介绍

3月28日-29日,2024国际集成电路展览会暨研讨会(IIC Shanghai)在上海成功举行。此次盛会汇聚了集成电路产业的众多领军企业,共同探寻和把握集成电路产业的发展脉络。 龙智携芯片研发及管理解决方案亮相展会,展示如何通…

竞品分析:密雪冰城

​蜜雪冰城,是张红超于1997年在郑州成立的冰淇淋与茶饮的品牌。主要从事现制饮品、现制冰淇淋及其核心食材的研发、生产、销售以及品牌运营管理。 2022年营收超60亿元,海外门店接近3000家,全球门店总计突破25000家。 Part.1定位 当时不少奶…

Node.JS安装及配置教程(Windows)【安装】

文章目录 一、 Node.JS 下载1. 官网下载(1)国内地址(2)国外地址 2. 其它渠道 二、 Node.JS 安装三、 Node.JS验证四、 Node.JS 配置(可选)1. 配置全局模块安装路径方法一方法二2. 配置国内镜像 五、 yarn 安…

黑盒优化系列(一):自动化提示词优化【一、绪论】

大语言模型的提示词 随着ChatGPT等大语言模型的问世,我们获取知识的方式从单一的搜索引擎如Google转变为类似ChatGPT这种通过 Q & A 方式提供的方法。 我们尝试对比一下不同提示词,对应的模型输出 ChatGPT无提示词 API: ChatGPT 3.5 …

深入理解Python协程:从基础到实战

title: 深入理解Python协程:从基础到实战 date: 2024/4/27 16:48:43 updated: 2024/4/27 16:48:43 categories: 后端开发 tags: 协程异步IO并发编程Pythonaiohttpasyncio网络爬虫 第1章:协程基础 1.1 协程概念介绍 协程(Coroutines&…

以生命健康为中心的物联网旅居养老运营平台

随着科技的飞速发展和人口老龄化的日益加剧,养老问题逐渐成为社会关注的焦点。传统的养老模式已经难以满足现代老年人的多元化需求,因此,构建一个以生命健康为中心的物联网旅居养老运营平台显得尤为重要。 以生命健康为中心的物联网旅居养老运…

敷尔佳2023年报前瞻:“医美面膜第一股”的护城河及2024展望

查理芒格曾说:“要去鱼多的地方打渔”。历数长线牛股辈出的领域,消费行业无疑是大赢家。此中,美业又是消费行业最好的细分赛道之一。 4月26日,A股“医美面膜第一股”–敷尔佳(SZ:301371)将发布2023年财报,按惯例对本季…

2024最新智慧医疗智慧医院大数据展示,医院数据采集概况、医院指标分析、医院就诊趋势分析等。源代码免费下载。

系列文章目录 【复制就能用1】2分钟玩转轮播图,unslider的详细用法 【复制就能用2】css实现转动的大风车,效果很不错。 【复制就能用3】2分钟自己写小游戏:剪刀石头布小游戏、扫雷游戏、五子棋小游戏 【复制就能用4】2024最新智慧医疗智慧医院大数据…

2024年Q1季度干衣机家电线上市场数据分析

春季阴雨绵绵,空气湿度增加,为晾晒衣物带来不便。与此同时,新消费主义的崛起也促使消费者更加注重时间效率和生活品质,寻求能够快速、方便地处理衣物的解决方案。借此,干衣机的需求量有所上涨。 根据鲸参谋数据显示&a…

【HCIP学习】BGP基础

一、BGP产生背景 BGP(Border Gateway Protocol,边界网关协议)是一种用于自治系统间的动态路由协议,是一种外部网关协议。 自治系统AS:一组同一个管理机构进行管理,对外呈现统一选路策略的路由器的集合。 …

解锁大模型高效推理:将 LlamaIndex 与抽象链集成

在语言理解领域,对忠实推理的追求促使研究人员探索各种途径。 大型语言模型(LLMs)在解释和执行指令方面取得了显著进展,但在准确回忆和组合现实世界知识方面仍然面临挑战。 为了解决这个问题,将外部工具集成到LLMs的…

Linux网络—DNS域名解析服务

目录 一、BIND域名服务基础 1、DNS系统的作用及类型 DNS系统的作用 DNS系统类型 DNS域名解析工作原理: DNS域名解析查询方式: 2、BIND服务 二、使用BIND构建域名服务器 1、构建主、从域名服务器 1)主服务器配置: 2&…

中国十大气膜厂商揭晓:引领未来建筑创新潮流

近年来,我国的体育产业蓬勃发展,其中气膜体育馆备受瞩目。国务院办公厅在《关于构建更高水平的全民健身公共服务体系的意见》中明确提出,支持建设符合环保和安全等要求的气膜结构健身馆等新型健身场地设施。气膜体育场馆已成为解决我国体育基…

java spring 07 createBean()(加载class文件,重写方法,实例化前)和doCreateBean()

01.createBean方法 protected Object createBean(String beanName, RootBeanDefinition mbd, Nullable Object[] args)throws BeanCreationException {if (logger.isTraceEnabled()) {logger.trace("Creating instance of bean " beanName "");}RootBea…

PostgreSQL数据库序列的DDL获取和细节处理

PostgreSQL数据库序列的DDL获取和细节处理 创建测试数据dump导出方式表列与序列强关联case场景序列DDL拼接SQL语句序列删除情况 看腻了就来听听视频演示吧: SQL拼接获取DDL:https://www.bilibili.com/video/BV1Rw4m1Z7SV/ dump方式获取DDL:ht…

【Windchill二次开发】针对该文档定义初始化规则,修改编号或名称的规则

(一)什么是软类型 类型属性定义: (二)对象初始化规则 rule(初始化规则) ---------------------------------------------------------------------------------------------------------------…

物联网实战--平台篇之(一)架构设计

本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/category_12631333.html 一、平台简介 物联网平台这个概念比较宽,大致可以分为两大类&#x…

探索矿业数字化平台:实现智能化采矿与管理

随着信息技术的迅猛发展,矿业领域也在逐步实现数字化转型。数字化平台的出现为矿业企业带来了更高效、更智能的采矿与管理方式。本文将探讨矿业数字化平台的意义、特点以及未来发展方向。 ### 1. 数字化平台的意义 传统的矿业生产和管理方式存在诸多问题&#xff…

Python实践应用|NC文件读取

import netCDF4 as nc import numpy as np import matplotlib.pyplot as plt# 打开NC文件 nc_file E:/NC_file/air.sig995.2012.nc # 将your_file.nc替换为你的NC文件路径 nc_data nc.Dataset(nc_file, r)# 查看NC文件中包含的变量 print("Variables in the NC file:&q…