最近在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指令碼模組仍然處於初期的開發階段。它支援絕大多數的核心系統 基層的視窗類,不過,對...