要在QT 中使用protobuf的环境配置:
1. 选择合适的protobuf版本
必须选择qt5.9 对应mingw编译器所适配的protobuf 版本。最开始直接下载protobuf3.19版本,结果qt5.9对应的编译器版本为 GNU 5.* ,编译不过去。会报出 :non-literal type ‘google::protobuf::internal::CallOnceInitializedMutexstd::mutex 的错误,如下所示:
D:\360downloads\protobuf-cpp-3.19.1\protobuf-3.19.1\src\google\protobuf\stubs\mutex.h:124: error: temporary of non-literal type ‘google::protobuf::internal::CallOnceInitializedMutexstd::mutex’ in a constant expression
constexpr WrappedMutex() {}
出现上述错误是因为,编译protobuf库的时候选择了高版本,编译通过了,而例用protobuf库编译demo时,用了qt5.9自带的较低版本的mingw编译器,所以编译不通过。
尝试将qt的编译器改为单独装的高版本的mingw,发现此路不通(不太容易还有别的错误 )。本来想换更高版本的qt但是高版本的qt安装也很费劲。
后来选择protobuf3.16-rc1这个版本是兼容qt5.9的!链接为:https://github.com/protocolbuffers/protobuf/releases?page=3protobuf下载地址
2. 编译protobuf 3.16
这里只记录win版本的编译过程:
-
首先下载cmake-gui,已经装了略过此步。下载地址:https://cmake.org/download/cmake-gui下载链接,我这里选择的是cmake-gui3.22最近的一版,cmake是兼容的。然后安装cmake,按照安装页面,点点点就好了。
-
下载protobuf3.16cpp版本,链接如上。
-
配置qt5.9的工具链为系统的编译工具,以便cmake-gui读取的是与qt5.9配套的工具链。
找到对应qt工具链安装的路径 如:D:\Qt\Qt5.9.0\Tools\mingw530_32\bin
将该路径配置到系统path中,并重启。
-
编译protobuf静态库:
打开cmake -gui 选择proto源码的cmake 文件夹 ,创建build的文件夹,并选择为编译目标文件夹:
点击configure 然后点击generate.
如果没有ZLIB可以不选。
完成后,可以在对应的build的文件夹中看到makefile等文件。然后在对应build文件夹路径下打开cmd。
然后 输入 mingw32-make 等待编译完成。
生成对应 libprotobuf.a 等静态库。还有proto.exe的可执行二进制程序。
如果懒得编译库可以看这里,编译好的库可以直接下载使用https://download.youkuaiyun.com/download/hyperspace88466/75075496编译好的库直接下载点这里
3. 编译一个demo验证protobuf配置成功
具体例子见:https://blog.youkuaiyun.com/jamin_liu_90/article/details/83244335
编译demo验证protobuf配置成功见这里
以下为转载内容
-
由于在使用protobuf时要先构建一个proto文件,然后生成对应的头文件和源文件,才能够使用。所以在build文件中构建protobuild.bat脚本文件,在里面添加如下内容。然后将build文件路径添加到环境变量中。如果想要生成某个proto文件对应的头文件和源文件,可以在cmd进入到proto文件所在目录下,输入protobuild *****.proto来进行生成。
-
调试示例
建立config.proto文件,放在build文件夹下,代码如下:
syntax = "proto3"; package config; message VoiceConfig{ int32 sample_rate = 1; int32 mic_num = 2; string voiceserver_address = 3; int32 wakeup_sensitivity = 4 ; int32 bargein_sensitivity = 5; int32 audo_outtype = 6; } 生成 config.pb.h 和 config.pb.cc 建立一个Qt项目 其中主函数中代码如下: #include <QCoreApplication> #include <QDebug> #include <QString> #include <string> #include <config.pb.h> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); config::VoiceConfig vc; QString ipaddr="192.168.0.136"; std::string s = ipaddr.toStdString(); vc.set_sample_rate(32000); vc.set_allocated_voiceserver_address(&s); vc.set_wakeup_sensitivity(50); vc.set_bargein_sensitivity(50); vc.set_audo_outtype(1); std::string sdata=""; vc.SerializeToString(&sdata); qDebug()<<"size:"<<sdata.size(); config::VoiceConfig de; de.ParseFromString(sdata); qDebug()<<"sample_rate:"<<de.sample_rate(); qDebug()<<"address:"<<QString::fromStdString(de.voiceserver_address()); qDebug()<<"wakeup_sensitivity:"<<de.wakeup_sensitivity(); return a.exec(); }
然后我们还需要配置一下头文件和protocolbuffer的库文件
在.pro 文件中加入
INCLUDEPATH += “C:***\protobuf-3.6.1\src”
然后将libprotobuf.a库文件进行导入其中,链接选择“静态”,只选择Windows。
原文链接:https://blog.youkuaiyun.com/jamin_liu_90/article/details/83244335