protobuf的編譯和使用,在windows平台上


版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/hp_cpp/article/details/81561310

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

 


免責聲明!

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



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