VC2022 + protobuf 3.35--不建议用protobuf新版本,如下的尝试仍然存在链接问题,推荐 protobuf-cpp-3.21.1(Protocol Buffers v21.1)

文章讲述了作者在升级protobuf到3.25版本时遇到的麻烦,由于protobuf引入了Google的Abseil组件,导致编译复杂。作者提供了下载3.25版本并配置Abseil的步骤,以及如何在不依赖Abseil的情况下编译和使用protobuf的详细过程,最后选择降级到3.20.1版本以解决问题。
摘要由CSDN通过智能技术生成

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

实在对不住,再次尝试一下,居然存在链接问题,已经将log 相关库全部加上,未解决,上次用还是OK的,唉

om.quaero.sw.maco\Middleware\vs2022solution\middleware_ut\x64\Debug\Emulator_ut.lib 和对象 D:\work\workbench\Middleware_DBAccess\com.quaero.sw.maco\Middleware\vs2022solution\middleware_ut\x64\Debug\Emulator_ut.exp
1>EmuCmdExecutor_test.obj : error LNK2019: 无法解析的外部符号 "private: void __cdecl absl::log_internal::LogMessage::CopyToEncodedBuffer<0>(class std::basic_string_view<char,struct std::char_traits<char> >)" (??$CopyToEncodedBuffer@$0A@@LogMessage@log_internal@absl@@AEAAXV?$basic_string_view@DU?$char_traits@D@std@@@std@@@Z),函数 "public: class absl::log_internal::LogMessage & __cdecl absl::log_internal::LogMessage::operator<<<19>(char const (&)[19])" (??$?6$0BD@@LogMessage@log_internal@absl@@QEAAAEAV012@AEAY0BD@$$CBD@Z) 中引用了该符号
1>EmuCmdExecutor_test.obj : error LNK2019: 无法解析的外部符号 "public: __cdecl absl::log_internal::LogMessageFatal::LogMessageFatal(char const *,int,class std::basic_string_view<char,struct std::char_traits<char> >)" (??0LogMessageFatal@log_internal@absl@@QEAA@PEBDHV?$basic_string_view@DU?$char_traits@D@std@@@std@@@Z),函数 "public: class Emul_UI_proto::ErpcCmdReply const & __cdecl google::protobuf::internal::RepeatedPtrFieldBase::Get<class google::protobuf::RepeatedPtrField<class Emul_UI_proto::ErpcCmdReply>::TypeHandler>(int)const " (??$Get@VTypeHandler@?$RepeatedPtrField@VErpcCmdReply@Emul_UI_proto@@@protobuf@google@@@RepeatedPtrFieldBase@internal@protobuf@google@@QEBAAEBVErpcCmdReply@Emul_UI_proto@@H@Z) 中引用了该符号
1>EmuCmdExecutor_test.obj : error LNK2019: 无法解析的外部符号 "class absl::Status __cdecl google::protobuf::json::JsonStringToMessage(class std::basic_string_view<char,struct std::char_traits<char> >,class google::protobuf::Message *,struct google::protobuf::json::ParseOptions const &)" (?JsonStringToMessage@json@protobuf@google@@YA?AVStatus@absl@@V?$basic_string_view@DU?$char_traits@D@std@@@std@@PEAVMessage@23@AEBUParseOptions@123@@Z),函数 "class absl::Status __cdecl google::protobuf::json::JsonStringToMessage(class std::basic_string_view<char,struct std::char_traits<char> >,class google::protobuf::Message *)" (?JsonStringToMessage@json@protobuf@google@@YA?AVStatus@absl@@V?$basic_string_view@DU?$char_traits@D@std@@@std@@PEAVMessage@23@@Z) 中引用了该符号

类似于如下问题

https://github.com/protocolbuffers/protobuf/issues/12292

听人劝,吃饱饭,换成了

protobuf-3.20.1

https://github.com/protocolbuffers/protobuf/releases?page=6

暂时和Abseil说再会,等下次必须用的时候再来尝试

  • 31
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 当在终端或命令行中使用类似于wget或curl等下载工具时,出现downloading v3.1.0/protobuf-cpp-3.1.0.tar.gz...的提示意味着正在下载protobuf-cpp-3.1.0.tar.gz这个文件。这通常是下载一个开源软件包或源代码。 protobuf-cpp是Google开发的一种高效的序列化数据结构的工具,能够将数据以二进制形式进行编码并进行传输和存储。protobuf-cpp软件包包含了编译器和相应的库文件,以及开发人员使用protobuf-cpp的各种实用程序和示例代码。在下载这个软件包之前,需要检查自己是否已经安装了编译器和相关的库文件,以便可以正确地编译和使用该软件包。 下载完成后,用户可以将protobuf-cpp集成到他们的项目中,利用这个功能强大的工具来序列化和反序列化数据。如果用户遇到了任何问题或需要进一步的帮助,可以去官方网站或社区寻求支持和反馈。 ### 回答2: 出现downloading v3.1.0/protobuf-cpp-3.1.0.tar.gz是指正在下载谷歌开发的 Protocol Buffers 3.1.0 版本中的C++实现库protobuf的软件压缩文件,这是一种轻量级高效数据交换格式,可用于各种服务间的数据通信,同时也是很多开源软件的重要依赖库之一。当出现downloading v3.1.0/protobuf-cpp-3.1.0.tar.gz...时,一般是因为用户正在使用支持自动化编译和依赖管理的软件管理器,如yum、apt-get或者brew等,这些工具会自动下载并安装所需要的软件库及其依赖,极大地方便了程序开发者和系统管理员的工作。同时,这个过程也需要一定的网络连接和下载时间,用户必须确保网络畅通并耐心等待,以保证软件的正常安装和使用。 ### 回答3: 这是提示正在下载版本为3.1.0的protobuf-cpp.tar.gz文件,protobuf-cpp是一种轻量级的数据交换格式,常用于不同系统间的数据通信。在下载过程中可能会出现下载速度变慢或者下载失败等情况,需要注意网络状况和服务器状态。如果下载失败,可以尝试重新下载或者通过其他途径获取所需文件。同时也需要注意要下载正确版本的文件,以避免后续的代码运行问题。下载完成后,需要将文件正确地放置到相应的目录下,并进行相关配置和编译工作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值