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编译器依然有问题:

1in function `absl::lts_20240722::log_internal::LogMessage::operator<<(unsigned long long)':
2[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_'
3[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的控制台中切换到此目录,使用命令:

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

降级安装:

 1$ pacman -U -d mingw-w64-x86_64-protobuf-21.12-1-any.pkg.tar.zst
 2正在加载软件包...
 3警告:正在降级软件包 mingw-w64-x86_64-protobuf (28.3-2 => 21.12-1)
 4正在解析依赖关系...
 5正在查找软件包冲突...
 6
 7软件包 (1) mingw-w64-x86_64-protobuf-21.12-1
 8
 9全部安装大小:   30.84 MiB
10净更新大小:    -11.97 MiB
11
12:: 进行安装吗? [Y/n] y
13(1/1) 正在检查密钥环里的密钥                                 [###############################] 100%
14(1/1) 正在检查软件包完整性                                   [###############################] 100%
15(1/1) 正在加载软件包文件                                     [###############################] 100%
16(1/1) 正在检查文件冲突                                       [###############################] 100%
17(1/1) 正在检查可用存储空间                                   [###############################] 100%
18:: 正在处理软件包的变化...
19(1/1) 正在降级 mingw-w64-x86_64-protobuf                     [###############################] 100%

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

1$ pacman -U mingw-w64-x86_64-protobuf-21.12-1-any.pkg.tar.zst
2正在加载软件包...
3警告:正在降级软件包 mingw-w64-x86_64-protobuf (28.3-2 => 21.12-1)
4正在解析依赖关系...
5正在查找软件包冲突...
6错误:无法准备事务处理 (无法满足依赖关系)
7:: 安装 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库的话,也可以直接删除掉:

 1pacman -R mingw-w64-x86_64-python-protobuf
 2正在检查依赖关系...
 3
 4软件包 (1) mingw-w64-x86_64-python-protobuf-5.28.3-1
 5
 6全部移去体积:  3.02 MiB
 7
 8:: 打算删除这些软件包吗? [Y/n] y
 9:: 正在处理软件包的变化...
10(1/1) 正在删除 mingw-w64-x86_64-python-protobuf              [###############################] 100%

再降级安装:

 1$ pacman -U mingw-w64-x86_64-protobuf-21.12-1-any.pkg.tar.zst
 2正在加载软件包...
 3警告:正在降级软件包 mingw-w64-x86_64-protobuf (28.3-2 => 21.12-1)
 4正在解析依赖关系...
 5正在查找软件包冲突...
 6
 7软件包 (1) mingw-w64-x86_64-protobuf-21.12-1
 8
 9全部安装大小:   30.84 MiB
10净更新大小:    -11.97 MiB
11
12:: 进行安装吗? [Y/n] y
13(1/1) 正在检查密钥环里的密钥                                 [###############################] 100%
14(1/1) 正在检查软件包完整性                                   [###############################] 100%
15(1/1) 正在加载软件包文件                                     [###############################] 100%
16(1/1) 正在检查文件冲突                                       [###############################] 100%
17(1/1) 正在检查可用存储空间                                   [###############################] 100%
18:: 正在处理软件包的变化...
19(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编译的库的问题中的方式来解决!

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