QT中使用MinGW 編譯的protobuf庫--包含庫的生成和使用


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 免去了編譯的步驟。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM