protocol_buff在windows下使用mingw32編譯方法


最近接手的一個項目在消息上使用了protocol_buff(以下簡稱protobuf),是一個挺方便的消息結構體,之前沒有接觸過,便記錄下在windows學習過程

protobuf的簡介(轉自百度百科)

 

protobuf(以下簡稱PB)是google 的一種數據交換的格式,它獨立於語言,獨立於平台。google 提供了多種語言的實現:java、c#、c++、go 和 python,每一種實現都包含了相應語言的編譯器以及庫文件。由於它是一種二進制的格式,比使用 xml 進行數據交換快許多。可以把它用於分布式應用之間的數據通信或者異構環境下的數據交換。作為一種效率和兼容性都很優秀的二進制數據傳輸格式,可以用於諸如網絡傳輸、配置文件、數據存儲等諸多領域。

protobuf的下載


protobuf源代碼下載路徑: http://code.google.com/p/protobuf/downloads/list (沒翻牆你能打開?反正我不翻打不開)
github上下載路徑:https://github.com/google/protobuf

不小心下多了,把主干分支和release全下下來了,目前最新的版本是3.4.0

編譯protobuf

了解過protobuf的同學們都知道protobuf使用之前要先進行編譯生成protoc.exe,再用protoc.exe編譯我們寫的.proto類型的文件。

編譯環境:win7 X64
編譯器:mingw32
cmake:3.9.2
首先進入protobuf的文件中,這里我們用的protobuf版本是3.4.0版本,編譯在tags/3.4.0/文件夾中進行
打開cmake-gui,
where is the source code復選框中填入3.4.0版本中的cmake文件夾(cmake文件使用的cmakelists.txt在這個文件夾中)
where to build the binaries復選框中填入cmake文件夾下的build文件夾(這個可以自己建一個build文件夾)
系統環境變量中請添加上cmake安裝目錄下的bin文件夾以及mingw安裝目錄下的bin文件夾。例如我當前的機器:D:\programfiles\cmake\bin;C:\MinGW\bin
請確保你的mingw中含有mingw32-make.exe,如果沒有的話,請在cmd中執行下面的命令:
mingw-get install gcc g++ mingw32-make

 


點擊configure,配置選擇默認的mingw makefile巴拉巴拉什么的。。。,等待cmake自動配置,配置完成圖:

點擊generate,生成makefile等文件

 


生成好makefile后,到github上下載gmock以及gtest,以下文件截取自cmake文件夾下的readme文件(此處也可跳過,在cmake中增加參數protobuf_BUILD_TESTS=OFF)

下載后在protobuf文件夾中建立gmock文件夾,將gmock中的代碼等拷貝到其中,再在gmock文件夾中建立gtest文件夾,將gtest文件夾中的文件拷貝到其中,如下圖:

打開cmd,切換到當前目錄下,執行mingw32-make命令並等待make命令運行完畢

 

我這邊在運行到73%。。。檢查tests依賴的時候會報錯。。。還沒搞清楚為什么會報錯,但是tests貌似我們不用?(我是這么覺得的)看了下文件,我們需要的protoc.exe已經生成了,就先不管它了。(后來又仔細看了下makefile,原來可以在cmake中添加參數-Dprotobuf_BUILD_TESTS=OFF來關閉測試,也就不需要再下載gmock和gtest了)

已經生成了protoc.exe

.proto文件的編譯


將生成好的protoc.exe文件放到寫好的.proto文件路徑下,並打開命令行切換到該目錄下
執行命令:protoc.exe -proto_path=SRC --cpp_out=DST SRC/test.proto
參數:SRC:proto文件所在文件夾 DST:生成目標文件夾 SRC/test.proto源文件名

 

將生成的*.pb.h,*.pb.cc文件放到項目文件夾下,項目頭文件引用增加protobuf/src路徑,鏈接文佳增加在build文件夾中生成的libprotobuf.a即可編譯了

附一個測試用例:


#include <iostream>
#include "test.pb.h"
using namespace std;

int main()
{
GOOGLE_PROTOBUF_VERIFY_VERSION;
string send;
pblxtest::pblxtest test1;
pblxtest::pblxtest test2;
test1.set_name("testname");
test1.set_age(23);
cout << test1.IsInitialized() << endl;
test1.SerializeToString(&send);
cout << send << endl;
test2.ParseFromString(send);

cout << test2.name() << " " << test2.age() << endl;
return 0;
}

 

 


免責聲明!

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



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