2012-01-20 24 views
32

我想編譯一個調用一些導出函數的lua腳本,將結果字節碼保存到一個文件中,然後加載這個字節碼並執行它,但是我沒有找到了如何做到這一點的任何例子。有沒有關於如何做到這一點的例子?我怎樣才能做到這一點?編譯lua代碼,存儲字節碼,然後加載並執行它

編輯:我使用的Lua + Luabind(C++)

回答

51

這是非常簡單的。

首先,你加載Lua腳本而不是執行它。如果您已將Lua狀態與導出的功能連接,則無關緊要;你所做的只是編譯腳本文件。

您可以使用luaL_loadfile,它使用C標準庫函數從磁盤讀取文件並將其加載到lua_State中。或者,您可以自己將文件加載到字符串中,並使用luaL_loadstring將其加載到lua_State中。

這兩個函數都會按照the documentation for lua_load發出返回值和編譯器錯誤。

如果編譯成功,lua_State現在將已編譯的Lua塊作爲堆棧頂部的Lua函數。要獲得編譯的二進制文件,您必須使用lua_dump函數。這很複雜,因爲它使用回調接口來傳遞數據。見the documentation for details

之後,你有編譯的Lua字節碼。將其轉換成您選擇的文件。請記住:將其寫爲二進制,而不是文本翻譯。

當需要加載字節碼時,您所需要做的就是... 與您在之前所做的完全相同。好吧,差不多。 Lua啓發式檢測到它給出的「字符串」是一個Lua源字符串或字節碼。所以是的,你可以像以前一樣使用luaL_loadfile加載字節碼。

區別在於你不能使用luaL_loadstring和字節碼。該函數期望以NULL結尾的字符串,這是不好的。字節代碼可以在其中嵌入NULL字符,這將會使所有的東西都搞砸了。所以如果你想自己做文件IO(因爲你使用的是特殊的文件系統或者其他東西),你必須直接使用lua_load。其中也使用像lua_dump這樣的回調界面。所以read up on how to use it

+1

希望有更多這樣的聲音答案! – vines

+0

很好的答案,這正是我的想法,但我只是不知道該用什麼。我會嘗試一下。現在告訴我,在常見問題解答中甚至文檔中加入這樣的東西(明確而客觀)有多難?謝謝! – WoLfulus

+5

@WoLfulus:如果你用谷歌搜索「Lua load bytecode」,[非常第一鏈接](http://csl.sublevel3.org/lua/)會告訴你你需要知道的一切。所以我沒有看到需要關於這方面的常見問題。而應用程序'luac'已經可以將Lua腳本預編譯成字節碼,所以你甚至不需要一個程序來完成它。所以真的,不需要常見問題解答;只是正確使用Google。 –