使用MinGW编译protobuf 3.5.1.1遇测试失败及链接错误求助
解决MinGW编译Protobuf 3.5.1.1后测试失败及链接错误的问题
问题描述
我正尝试为一款使用Google protobuf 3.5.1.1的C++程序重建开发环境。我已通过MinGW编译完成protobuf,过程看似正常,但执行
make check命令时出现5项测试通过、1项失败(protobuf-test.exe测试失败)的情况。我在MSYS2中执行的命令依次为:./autogen.sh、./configure、make、make check。当我尝试编译依赖该protobuf的程序时,出现大量链接错误。恳请各位提供解决建议。
可能的原因分析
- MinGW环境下编译Protobuf时,默认配置可能存在32/64位环境不匹配、依赖库缺失等兼容性问题,导致编译出的库存在功能缺陷
make check测试失败直接说明生成的Protobuf库本身有问题,后续依赖它的程序自然会出现链接错误- 手动编译的Protobuf版本可能和MSYS2系统中预装的版本冲突,链接时引用了错误的库文件
通用排查与解决步骤
确保MSYS2环境完整且更新
- 先更新MSYS2包管理系统:
重启终端后再执行一次pacman -Syupacman -Su,确保所有组件都更新到最新状态 - 安装MinGW编译所需的基础工具链(以32位为例,64位替换为
mingw-w64-x86_64-*):pacman -S mingw-w64-i686-toolchain mingw-w64-i686-cmake
- 先更新MSYS2包管理系统:
重新编译Protobuf并指定明确配置
- 先清理之前的编译残留文件,避免影响新的编译过程:
make clean && rm -rf autom4te.cache config.log config.status - 执行configure时指定MinGW目标平台和安装路径,避免和系统库冲突:
./configure --host=i686-w64-mingw32 --prefix=/mingw32 - 并行编译并安装:
make -j$(nproc) && make install
- 先清理之前的编译残留文件,避免影响新的编译过程:
定位测试失败的具体原因
- 直接运行失败的测试程序,查看详细错误输出:
./protobuf-test.exe - 检查
config.log和make check的完整输出日志,看看编译过程中是否有被忽略的警告或错误,这些往往是测试失败的根源
- 直接运行失败的测试程序,查看详细错误输出:
最终解决方案(提问者亲测有效)
最终我通过在MSYS2 MinGW 32-bit终端更新protobuf,并按照指定教程更新MSYS2解决了该问题。
内容的提问来源于stack exchange,提问作者emesel




