如何將ProtoBuffer生成Erlang檔案

2021-08-11 09:12:23 字數 1838 閱讀 2393

1.安裝git工具,並將git下的bin目錄新增到path路徑中。

2.安裝mingw,並新增到path路徑中。

3.從中checkout原始碼。

5.編譯我們的protobuffer檔案,假定我們將protobuffer檔案xx.proto複製到gpb/bin目錄下,並在此目錄下建立乙個pb目錄,我們在gpb/bin目錄中再建立乙個批處理來生成erlang檔案,批處理檔案compile.bat內容如下:

escript protoc-erl -i. -o ./pb xx.proto

pause

該命令會將生成的erlang檔案放到gbp/bin/pb目錄中。這是只有乙個pb檔案的情況,在實際專案中,我們一般會有多個pb檔案,這些pb檔案可能還會有依賴關係,比如我們有兩個pb檔案xx.proto和yy.proto:

yy.proto:

package protocol;

option optimize_for = lite_runtime;

option cc_generic_services = false;

enum evalue

;

xx.proto:

package protocol;

import "yy.proto";

option optimize_for = lite_runtime;

option cc_generic_services = false;

message msg

;

這個時候執行compile.bat,會產生乙個錯誤:

in msg msg, field v1: undefined reference  yy.evalue

說明目前的gpb還不支援具有依賴關係的pb,為了解決這個問題,我對原始碼進行了除錯,發現gpb在解析pb檔案時並沒有去處理依賴關係,既然沒處理依賴,那我們加上依賴的處理即可。找問題需要花時間,只要找到問題的根源了,解決起來也許就是一小段**就可以解決的事情。經除錯查詢,gpb解析pb原始檔的原始碼在gpb_parse.yrl檔案中,而解決pb依賴關係的**是由:

resolve_ref(defs, ref, root, fullname)
函式處理的,我們只需要加乙個解決依賴的**,然後在上面的函式中呼叫一下即可,完整**如下:

filterref([_,'.',type]) -> [type];

filterref(other) -> other.

%% -> |} | not_found

resolve_ref(defs, ref0, root, fullname) ->

ref = filterref(ref0),

case is_absolute_ref(ref) of

true ->

fullref = ensure_path_prepended(root, ref),

find_typename(fullref, defs);

false ->

possibleroots = compute_roots(fullname),

find_ref_rootwards(possibleroots, ref, defs)

end.

現在執行compile.bat就不會報錯了,可以在gpb/bin/pb目錄下看到四個檔案。

btw:寫完本部落格才發現之前有寫過一類似的部落格,當時csdn無法登入,在寫的,參見:

祝玩得開心!

如何將表單居中顯示 如何將重複資料突出顯示?

將 中一列資料中重複的,使用特殊顏色突出顯示或者使用一些符號標記出來。例如 乙個 商,可以邀請別的 商加入成為聯合體,報表要顯示所有 商,然後 商最後一列顯示所有聯合體,當聯合體 商跟別的 商重複時要突出顯示,並且加星號。用設計器自帶 demo 資料來源中的訂單明細資料表,使用嚮導建立一張分組報表,...

如何將FBReader引入MID

1.從fbreader的官網 得到源 包 這裡用到的是fbreader 0.8.17 2.編譯,執行make,報錯,這是因為其用到了linebreak這個庫,他是負責處理unicode編碼文件的換行問題的。google到linebreak,make,將debugdir裡的 a o全部複製到 usr ...

如何將Flutter引入AndroidStudio

相信不少道友們了解了一些flutter相關的知識,兄弟愚鈍,今始方入坑中來,為方便後來之人亦己常顧之,特記錄在部落格當中 廢話不多講,學習flutter可以參考flutter中文網,裡面有詳細的介紹及搭建方法。我就把我如何引入到as中的過程記錄下來。小弟的環境是win10,下面介紹的也是此環境下的引...