前言
上一篇讲了如何用vs2019的编译工具msvc来编译生成protobuf的静态库,并在vs2019的工程里配置和使用。见Protobuf如何集成到C++环境中(VS2019)。
但如果想在windows上使用 QT+MinGW的方式来使用protobuf的库,用msvc编译的库就没有用了。
安装MYSYS2
参考我上一篇博客用MSYS2安装mingw。安装MYSYS2后,需要安装一些必要的库。
- autoconf
- automake
- libtool
- make
- g++
- unzip
这些库是官方要求安装的库,但通过安装base-devel 的子包autoconf、autogen、automake1.16、libtool、make、pkgconf。
和mingw-w64-x86_64-toolchain的子包mingw-w64-x86_64-gcc 、mingw-w64-x86_64-gdb、mingw-w64-x86_64-make、mingw-w64-x86_64-pkgconf也是可以得到这些库的。
当然也可以用pacman -Q [包名]
,来查询是否有这些库。
源码编译
安装完所需要的的依赖后,就可以编译了,先需要打开MSYS2 MinGW 64-bit,只有这个才有gcc等工具。
先把源文件代码copy进mysy2的home目录下,路径如D:\msys64\home\用户名。
不带zlib库
依次输入以下命令:
cd protobuf
./configure --prefix=/usr --with-zlib=no
make
make install
安装完成后,protobuf的lib文件会安装在/usr/lib目录下,google文件夹会安装在 /usr/include目录下,
protoc.exe
和libprotobuf-17.dll
、libprotobuf-lite-17.dll
、libprotoc-17.dll
文件会安装在/usr/bin目录下。这种安装方式是跟linux系统是一样的。
最后需要将/usr/bin的windows目录,例如D:\msys64\usr\bin添加到系统环境变量中。不然会提示"找不到libprotobuf-17.dll"的错误。
带zlib库
上面说的是不带zlib的,默认的./configure 文件是带zlib的编译的。
依次输入以下命令(在重新make
之前,先make clean
):
cd protobuf
./configure --prefix=/usr
make
make install
如果想使用带zlib的库,需要先安装vcpkg工具。
vcpkg的安装方法参考vcpkg官方github仓库。简单说一下步骤就是:
- 在C盘新建一个C:\dev\目录,cd进C:\dev\目录(文件名最好用dev和src)
- 输入
git clone https://github.com/microsoft/vcpkg
,把仓库clone下来 - cd进C:\dev\vcpkg目录,输入
.\bootstrap-vcpkg.bat
,运行安装脚本
安装好vcpkg后,安装zlib包。
.\vcpkg.exe install protobuf[zlib] protobuf[zlib]:x64-windows
vcpkg list
命令,可查看所有已安装的包
vcpkg remove [包名]
命令,可卸载已安装的包
vcpkg安装的包,会在C:\dev\vcpkg\packages目录下,我们需要将zlib的bin目录也添加进环境变量,不然会报"找不到zlib1.dll错误",例如C:\dev\vcpkg\packages\zlib_x64-windows\bin
QT链接库
QT使用protobuf的步骤:
- 新建QT工程,编译器选择MinGW 64-bit,类型选择Release
- 利用
protoc.exe
和自定义的.proto文件生成.cc文件和.h文件,并将.cc和.h添加进QT工程 - 在.pro文件后添加如下qmake代码,来链接protobuf动态库
LIBS += -LD:/msys64/usr/lib/ -lprotobuf
LIBS += -LD:/msys64/usr/lib/ -lprotobuf-lite
LIBS += -LD:/msys64/usr/lib/ -lprotoc
INCLUDEPATH += D:/msys64/usr/include
DEPENDPATH += D:/msys64/usr/include
PRE_TARGETDEPS += D:/msys64/usr/lib/libprotobuf.a
PRE_TARGETDEPS += D:/msys64/usr/lib/libprotobuf-lite.a
PRE_TARGETDEPS += D:/msys64/usr/lib/libprotoc.a
QT的测试代码与我上一篇的博客Protobuf如何集成到C++环境中(VS2019)类似。
如果出现运行,程序退出的情况,或者报缺dll文件,可能是环境变量没起作用,重启下基本解决问题。