在lua環境中使用protobuf

2021-09-08 13:32:44 字數 3115 閱讀 8330

最近在cocos2dx的專案中,需要在lua指令碼層使用protobuf協議。官方已經推出了很多種語言的版本。但唯獨lua版本不全。於是開始研究protobuf在lua下的實現,將完整的過程記錄了下來,希望對其它人能有所幫助。

簡單介紹一下裡面的三個目錄:

example 存放的乙個示例協議,

plugin 將.proto協議轉為lua指令碼需要的工具。要注意,這個工具是用python寫的,所以後面我們需要安裝python。

rotobuf這裡存放了工程需要的檔案。其中pb.c是c碼檔案。主要是在工程中引用,也可以編譯成動態檔案(.so)供lua呼叫。其它lua檔案則需要引入到lua工程中。

2、安裝python27。推薦是這個版本。

進入protobuf-2.4.1/vsprojects利用vs2010進行編譯。生成的protoc.exe放到protobuf-2.4.1/src下。如果不放,後面無法安裝python版的protobuf。

4、編譯python版本的protobuf

在protobuf-2.4.1\python下執行python setup.py build,然後再執行python setup.py install。

注意:如果第3步的protoc.exe沒有放,會出現錯誤找不到google\protobuf\compiler目錄。

5、製作轉換協議的批處理

在protoc-gen-lua/plugin目錄下編寫批處理:protoc-gen-lua.bat,就下面一行**。

@python "%~dp0protoc-gen-lua"

但要確保你的python命令能正常執行。否則將python.exe所在的目錄加到環境變數path中。

接著拷貝乙份protoc.exe到protoc-gen-lua目錄。第3步我們已經編譯了出了protoc.exe。在協議轉換中,我們需要使用他。

在protoc-gen-lua目錄編寫批處理:buildproto.bat 來轉換協議。

rem 切換到.proto協議所在的目錄  

cd ../luascript

rem 將當前資料夾中的所有協議檔案轉換為lua檔案

for %%i in (*.proto) do

(

echo %%i

"..\protobuf\protoc\protoc.exe

" --plugin=protoc-gen-lua="

..\protobuf\plugin\protoc-gen-lua.bat

" --lua_out=. %%i

) echo end

pause

請正確指定protoc.exe和protoc-gen-lua.bat相對協議目錄的路徑。

6、轉換協議檔案

protoc-gen-lua/example目錄中,有乙個協議檔案person.proto,可以拿他做一下試驗,會生成乙個person_pb.lua

7、編譯pb.c檔案

protoc-gen-lua/protobuf目錄中有乙個pb.c檔案。我們需要用他來協助lua完成protobuf的功能。

用vs2010新建乙個控制台程式。將pb.c加入到工程中。在windows平台下,要對pb.c做如下修改。

1)將 #include 修改為

#ifndef _win32

#include

#endif

避免在windows下缺失檔案報錯.

2)調整struct_unpack函式前幾行為

static int struct_unpack(lua_state *l)

// 注意防在命名空間外的全域性宣告

編寫主函式如下:

#include "

stdafx.h

"extern"c

" int main(int argc, char*ar**)

工程需要lua5.1.lib的接入。這個請自行編譯。

8、編寫main.lua。

也就是測試檔案,可以參考protoc-gen-lua/example中的test.lua。

package.path = package.path .. '

;./protobuf/?.lua

'require

"person_pb

"local msg =person_pb.person()

msg.id = 100

msg.name = "

foo"

msg.email = "

bar"

local pb_data = msg:serializetostring() --parse example

print(

"create:

", msg.id, msg.name, msg.email, pb_data)

local msg =person_pb.person()

msg:parsefromstring(pb_data)

print(

"parser:

", msg.id, msg.name, msg.email, pb_data)

10、總結。

這裡實現了,在c++中搭建lua的protobuf環境。但未實現純粹的lua-protobuf環境。

如果需要在lua中實現protobuf,那需要自己將pb.c編譯成dll。在linux下需要利用protoc-gen-lua/protobuf中的makefile將pb.c編譯成pb.so。

然後將pb.so或pb.dll匯入到lua工程中。然後在main.lua中呼叫pb.c中的入口,**如下:

local a = package.loadlib("

pb.dll

", "

luaopen_pb

");

a()

理論上是這樣,我還沒有做詳細的測試。如果有進展,再完善本貼。

**:

make  

make check

make install 

然後進入python目錄,

python setup.py install --prefix=$install_dir

在C 中使用LUA

lua.lib庫的使用 便於後期使用 便於開發中的標頭檔案引用 便於mfc工程的開發使用 使生成的是庫,而不用生成可執行檔案,便於其他工程的引用 新增頭檔案目錄,庫目錄 新增鏈結器附加依賴項 初始化lua虛擬機器 state lual newstate if state luaopen base s...

開始學習LUA,在LUA中使用UNICODE字串

新買到lua程式設計 第2版 開始學習lua程式設計。今天測試用lua呼叫windows的messageboxw函式。需要在lua中定義unicode字串。lua的string型別為8位編碼,包括數值0,可以編碼任意二進位制資料。如果編碼unicode,則需要使用 轉義序列。如字串 lua 如果使用...

在CEGUI中使用Lua指令碼入門

cegui所使用的指令碼是基於lua5.0.2 和tolua 1.06pre2 1的.介面的編寫很大一部分可以通過指令碼來實現.我們可以修改指令碼而不必重新編譯整個程式,這就為我們省去了好多時間去設計介面.目前的lua指令碼模組仍然處於初期的開發階段。它支援絕大多數的核心系統 基層的視窗類,不過,對...