0 准備工作:
(1)下載protobuf
https://github.com/google/protobuf/releases
下載的是cpp版本,選擇當前最新版本即可
(2)安裝cmake
https://cmake.org/download/
根據系統選擇安裝的cmake版本,我這里選擇的是64位版本安裝。
1 編譯protocol
解壓剛才下載的protobuf包,打開cmake
按圖所示,1選擇protobuf中的cmake目錄,2是選擇目標目錄(生成的工程存放位置),3的點擊左下角的configure按鈕:
以vs2015工程為例,上面的一個框是32位版本,下面的Win64是64位版本。以生成32位版本為例,生成64位版本工程操作相同。
點擊finish
沒有錯誤,generate按鈕變為可用,默認的選項如圖,這里就默認生成靜態包。
點擊generate按鈕后,幾秒后,Open Project按鈕變為可用,打開工程
這里可以選擇生成Debug版本32位的lib,只生成libprotobuf和protoc即可。
這3個是我們需要的。
3 測試生成的lib庫和protoc.exe工具
(1)新建一個person.proto的文本文件
package tutorial;
message Person {
required int32 id = 1;
required string name = 2;
optional string email = 3;
}
tutorial是包名(也可以說是命名空間),沒有第一行的話,就是沒有命令空間的。
將protoc.exe和person.proto放在同一個文件夾下,再添加一個批處理文件build.bat,內容為:
protoc --cpp_out=./ person.proto
雙擊批處理文件build.bat,會在當前目錄下生成:person.pb.h和person.pb.cc文件,將其添加到下面的vs工程中。
(2)建立一個win32控制台程序的工程
把protobuf-3.6.1\src\google\protobuf這個目錄中的頭文件(其余的文件可以刪除,也可以保留,不影響),都拷貝過來,放在當前工程下,建立一個include文件夾,把這些.h頭文件放進去(文件夾名自己定)。
生成的libprotobufd.lib也拷貝過來,放在當前目錄下的lib文件夾(自己新建的文件夾)中。
設置工程:
main.cpp代碼:
#include <iostream>
#include <fstream>
#include <string>
#include "person.pb.h"
using namespace std;
int main(int argc, char* argv[])
{
GOOGLE_PROTOBUF_VERIFY_VERSION;
tutorial::Person person;
//將數據寫到person.pb文件
person.set_id(123456);
person.set_name("Mark");
person.set_email("mark@example.com");
fstream out("person.pb", ios::out | ios::binary | ios::trunc);
person.SerializeToOstream(&out);
out.close();
//從person.pb文件讀取數據
fstream in("person.pb", ios::in | ios::binary);
if (!person.ParseFromIstream(&in)) {
cerr << "Failed to parse person.pb." << endl;
exit(1);
}
cout << "ID: " << person.id() << endl;
cout << "name: " << person.name() << endl;
if (person.has_email()) {
cout << "e-mail: " << person.email() << endl;
}
getchar();
return 0;
}
這兩個生成的文件要記得添加到工程中
編譯過程:
1>------ 已啟動全部重新生成: 項目: pbDemo, 配置: Debug Win32 ------
1> person.pb.cc
1> main.cpp
1> 正在生成代碼...
1> pbDemo.vcxproj -> D:\VS2015_Project\pbDemo\Debug\pbDemo.exe
1> pbDemo.vcxproj -> D:\VS2015_Project\pbDemo\Debug\pbDemo.pdb (Full PDB)
========== 全部重新生成: 成功 1 個,失敗 0 個,跳過 0 個 ==========
運行結果:
參考:
https://blog.csdn.net/program_anywhere/article/details/77365876
https://blog.csdn.net/lifeng_math/article/details/51993698
https://blog.csdn.net/qing666888/article/details/79137963
VS2013編譯錯誤:-D_SCL_SECURE_NO_WARNINGS解決方案:
https://blog.csdn.net/Apollon_krj/article/details/68923683
warning LNK4099: PDB 原因及解決方案:
http://www.cnblogs.com/fqucuo/p/4887083.html
