標籤:百度百科 參數 ini code 建立 效率 相容性 file 編譯環境
最近接手的一個項目在訊息上使用了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 (沒FQ你能開啟?反正我不翻打不開)
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;
}
protocol_buff在windows下使用mingw32編譯方法