Protobuf作为序列化中常见的功能模块,相信很多项目都在使用它,但是随着它的版本不断升级,也给开发者带来了一些问题,比如前面笔者介绍的VS2022解决Protobuf compiler version 23.4 doesn‘t match library version 4.23.4和CMake自动按目录结构编译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编译的库的问题中的方式来解决!
如果觉得有帮助,欢迎点赞收藏!