MSYS2 MinGW64使用Protobuf新版本踩坑

Protobuf作为序列化中常见的功能模块,相信很多项目都在使用它,但是随着它的版本不断升级,也给开发者带来了一些问题,比如前面笔者介绍的VS2022解决Protobuf compiler version 23.4 doesn‘t match library version 4.23.4CMake自动按目录结构编译Protobuf代码

由于新版本Protobuf使用absl库,让很多使用它的项目开发者觉得很头疼的就是解决它依赖absl库的问题,笔者在VS2022解决Protobuf compiler version 23.4 doesn‘t match library version 4.23.4一文中介绍了两种方法解决它。但是在MSYS2的MinGW环境下,只能使用GCC编译器,使用Clang编译器依然有问题:

in function `absl::lts_20240722::log_internal::LogMessage::operator<<(unsigned long long)':
[build] G:/msys64/mingw64/include/absl/log/internal/log_message.h:135:(.text$_ZN4absl12lts_2024072212log_internal10LogMessagelsEy[_ZN4absl12lts_2024072212log_internal10LogMessagelsEy]+0x19): undefined reference to `_ZN4absl12lts_2024072212log_internal10LogMessagelsIyTnNSt9enable_ifIXntsr4absl16HasAbslStringifyIT_EE5valueEiE4typeELi0EEERS2_RKS5_'
[build] clang++: error: linker command failed with exit code 1 (use -v to see invocation)

这是笔者使用最新的Clang 19.1.4版本无法正常链接使用了Protobuf 28.3的项目。

根据资料,Protobuf 21版本不依赖absl库,如果确有必要,可以将MSYS2中MinGW64的Protobuf版本降到21。可以看一下MSYS安装目录下var\cache\pacman\pkg是否有Protobuf 21的老版本包,笔者的电脑上还存在此包:

在这里插入图片描述
直接在MinGW64的控制台中切换到此目录,使用命令:

pacman -U -d mingw-w64-x86_64-protobuf-21.12-1-any.pkg.tar.zst

降级安装:

$ pacman -U -d mingw-w64-x86_64-protobuf-21.12-1-any.pkg.tar.zst
正在加载软件包...
警告:正在降级软件包 mingw-w64-x86_64-protobuf (28.3-2 => 21.12-1)
正在解析依赖关系...
正在查找软件包冲突...

软件包 (1) mingw-w64-x86_64-protobuf-21.12-1

全部安装大小:   30.84 MiB
净更新大小:    -11.97 MiB

:: 进行安装吗? [Y/n] y
(1/1) 正在检查密钥环里的密钥                                 [###############################] 100%
(1/1) 正在检查软件包完整性                                   [###############################] 100%
(1/1) 正在加载软件包文件                                     [###############################] 100%
(1/1) 正在检查文件冲突                                       [###############################] 100%
(1/1) 正在检查可用存储空间                                   [###############################] 100%
:: 正在处理软件包的变化...
(1/1) 正在降级 mingw-w64-x86_64-protobuf                     [###############################] 100%

在这里插入图片描述
如果不使用-d参数,则可能会报错:

$ pacman -U mingw-w64-x86_64-protobuf-21.12-1-any.pkg.tar.zst
正在加载软件包...
警告:正在降级软件包 mingw-w64-x86_64-protobuf (28.3-2 => 21.12-1)
正在解析依赖关系...
正在查找软件包冲突...
错误:无法准备事务处理 (无法满足依赖关系)
:: 安装 mingw-w64-x86_64-protobuf (21.12-1) 破坏依赖 'mingw-w64-x86_64-protobuf=28.3' (mingw-w64-x86_64-python-protobuf 需要)

安装不了。

如果不需要mingw-w64-x86_64-python-protobuf库的话,也可以直接删除掉:

pacman -R mingw-w64-x86_64-python-protobuf
正在检查依赖关系...

软件包 (1) mingw-w64-x86_64-python-protobuf-5.28.3-1

全部移去体积:  3.02 MiB

:: 打算删除这些软件包吗? [Y/n] y
:: 正在处理软件包的变化...
(1/1) 正在删除 mingw-w64-x86_64-python-protobuf              [###############################] 100%

再降级安装:

$ pacman -U mingw-w64-x86_64-protobuf-21.12-1-any.pkg.tar.zst
正在加载软件包...
警告:正在降级软件包 mingw-w64-x86_64-protobuf (28.3-2 => 21.12-1)
正在解析依赖关系...
正在查找软件包冲突...

软件包 (1) mingw-w64-x86_64-protobuf-21.12-1

全部安装大小:   30.84 MiB
净更新大小:    -11.97 MiB

:: 进行安装吗? [Y/n] y
(1/1) 正在检查密钥环里的密钥                                 [###############################] 100%
(1/1) 正在检查软件包完整性                                   [###############################] 100%
(1/1) 正在加载软件包文件                                     [###############################] 100%
(1/1) 正在检查文件冲突                                       [###############################] 100%
(1/1) 正在检查可用存储空间                                   [###############################] 100%
:: 正在处理软件包的变化...
(1/1) 正在降级 mingw-w64-x86_64-protobuf                     [###############################] 100%

如果本机没有protobuf 21版本的安装包,可以去官网https://repo.msys2.org/mingw/mingw64/看看是否还保留有此版本,目前还有此版本:

在这里插入图片描述
下面给出链接:
mingw-w64-x86_64-protobuf-21.12-1-any.pkg.tar.zst
mingw-w64-x86_64-protobuf-21.12-1-any.pkg.tar.zst.sig

号外,最好的办法是使用笔者后面博文解决Clang 18+不能链接GCC14编译的库的问题中的方式来解决!

如果觉得有帮助,欢迎点赞收藏!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值