QT中使用MinGW 編譯的protobuf庫--包含庫的生成和使用
0前言
最近要在QT中使用protobuf,於是需要編譯protobuf靜態庫文件,導入qt使用,沒想到過程非常曲折,各種報錯各種坑,在網上參考了很多文章,最后終於成功了,現在將QT中使用protobuf的整個配置過程都寫出來提供給大家,希望能夠幫助到大家。
1准備工作
1.1 下載QT並安裝
下載QT5.6.0,到D盤的QT文件夾,並且加入系統環境變量
D:\Qt\Qt5.6.0\Tools\mingw492_32\bin;D:\Qt\Qt5.6.0\5.6\mingw49_32\bin;D:\Qt\Qt5.6.0\Tools\mingw492_32\i686-w64-mingw32\bin
1.2 下載cmake3.11.0並安裝
在https://cmake.org/download/中下載Cmake
安裝到D:\anzhuangbao\cmake-3.11.0-rc1-win32-x86
加入系統環境變量
;D:\anzhuangbao\cmake-3.11.0-rc1-win32-x86\cmake-3.11.0-rc1-win32-x86\bin
1.3 下載protobuf3.3.0的源碼
在https://github.com/google/protobuf/releases中下載3.3.0的源碼,如圖所示
就是protobuf-cpp-3.3.0.zip
下載到D盤根目錄,解壓。
2生成protobuf庫文件
2.1 CMAKE的設置與庫的生成
打開cmake軟件,選擇編譯的源為protobuf源碼中的cmake文件夾,之后在D盤根目錄下建立輸出目錄,為output330,設置為目標文件夾,如圖所示。
然后點擊configure按鍵,選擇MinGW編譯,默認的編譯器即可,也就是QT自帶的編譯器,這樣比較保險,如果本機還有別的MinGW版本,建議不要選,就選QT自帶的編譯器即可,如圖所示。
點擊finish按鍵,開始配置。配置結束后,點擊Grouped和Advance
點開protobuf列表,只勾選一個MSVC_STATIC_RUNTIME,如下圖所示。
點擊Generate生成,如圖所示。
生成結束后,我們發現output330文件夾中出現了makefile文件,如圖所示。
打開cmd,進入output330文件夾,輸入mingw32-make命令,開始編譯源代碼,如下圖所示。
等待幾分鍾編譯結束。
編譯結束后,我們打開output330文件夾可以看到生成的庫文件和protoc.exe。如下圖所示。
如果沒有生成protoc.exe,則可以到剛才https://github.com/google/protobuf/releases中下載protoc-3.3.0-win32.zip,bin文件中就是這個exe.
2.2 proto.cpp和.h的生成
在D盤根目錄下新建一個文件testData.proto,后綴名為.proto,在文件中輸入代碼如下:
syntax = "proto3"; package config; message VoiceConfig{ int32 sample_rate = 1; int32 mic_num = 2; }
將之前生成的protoc.exe拷貝到C:\windows\system32中,並重命名為protoc330.exe,如圖所示。
打開cmd,進入D盤根目錄,也就是testData所在目錄,輸入如下命令,可在目錄中生成.cpp和.h文件。
至此,庫文件和源文件,頭文件都生成完畢了。
3在QT中測試protobuf的使用
3.1 建立工程,配置.pro
建立QT控制台工程,導入生成的.cpp和.h文件,打開.pro文件,配置如下:
3.2 編寫代碼測試
在main中輸入如下代碼,測試結果如下圖所示。
#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(); }
代碼中將數據結構中的兩個變量賦值為7,9,做了序列化和反序列化,解析后數據打印為7,9說明protobuf在QT中使用成功!
4結語
前前后后花了四天時間才搞定QT的protobuf,中間踩了很多坑,有人說必須動態編譯,還有的說要下載msys來編譯,中間浪費了很多時間,以上是我親自測試總結的方法,希望大家能用上,最后,我將已經編譯好的protobuf3.3.0的庫文件和protoc.exe打包上傳,需要的可以直接下載使用,https://download.csdn.net/download/f1jiaziqing2/10759471 免去了編譯的步驟。