ivaneeo's blog

          自由的力量,自由的生活。

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks

          將 Lua 源代碼直接放入最終產品,顯然不是個理想選擇。利用 LOOP 提供的 Precompiler 工具,可以將 Lua 模塊編譯為 C 代碼。

          準備工作

          LOOP 是一個 Lua 的 OOP 框架,Precompiler 則是 LOOP 中包含的一個工具。要安裝 LOOP,得先安裝 LuaRocks

          $ wget http://luarocks.org/releases/luarocks-2.0.5.tar.gz $ tar zxf luarocks-2.0.5.tar.gz $ cd luarocks-2.0.5 $ ./configure $ make $ sudo make install 

          然后安裝 LOOP:

          $ sudo luarocks install loop 

          OK,現在準備工作完成了,接下來就是編譯 Lua 模塊為 C 代碼。

          編譯

          我們的框架中有一個 display.lua 模塊,下面的代碼可以將這個模塊編譯出來:

          $ precompiler.lua -o luaqeeplayscripts -l "?.lua" -b -p qeeplay qeeplay/display.lua 

          最后會得到 luaqeeplayscripts.c/.h 文件。其中定義了函數:

          qeeplay int luaopen_qeeplay_display(lua_State *L); 

          在上述命令行中,各個參數的意義如下:

          -o: 指定輸出文件名,例如 -o luaqeeplayscripts 會輸出 luaqeeplayscripts.c/.h  -l: 指定推斷 lua 模塊名的模式,設定為 -l "?.lua" 就會以 lua 源文件名稱作為模塊名。     例如 display.lua 就是 display 模塊。如果 display.lua 文件在 qeeplay 子目錄中,     那么 qeeplay/display.lua 的模塊名就是 qeeplay.display。  -b: 編譯為字節碼  -p: 函數定義的前綴,一般指定一個可以方便以后對生成的 .c/.h 文件進行再處理 

          如果要將多個 lua 文件編譯為一個 C 代碼,可以添加更多的文件名到命令行中,例如:

          $ precompiler.lua -o luasocketscripts -l "?.lua" -b -p socket \     socket.lua \     socket/url.lua \     socket/tp.lua \     socket/smtp.lua \     socket/mime.lua \     socket/ltn12.lua \     socket/http.lua \     socket/ftp.lua 

          會創建 luasocketscripts.c/.h 文件,其中定義下列函數:

          socket int luaopen_socket(lua_State *L); socket int luaopen_socket_url(lua_State *L); socket int luaopen_socket_tp(lua_State *L); socket int luaopen_socket_smtp(lua_State *L); socket int luaopen_socket_mime(lua_State *L); socket int luaopen_socket_ltn12(lua_State *L); socket int luaopen_socket_http(lua_State *L); socket int luaopen_socket_ftp(lua_State *L); 

          載入編譯好的 C 代碼

          利用前一篇文章中的 lualoadexts.c/lualoadexts.h,做一些修改即可:

          luaqeeplayscripts.c

          #include "lualoadexts.h"  // qeeplay #include "luaqeeplayscripts.h"  static luaL_Reg luax_preload_list[] = {     {"qeeplay.display", luaopen_qeeplay_display},     {NULL, NULL} };  void luax_initpreload(lua_State *L) {     .... } 

          如果有更多模塊需要載入,只需要 include 相應的頭文件,并修改 luax_preload_list 定義即可。

          posted on 2012-02-08 00:01 ivaneeo 閱讀(1103) 評論(0)  編輯  收藏 所屬分類: lua-擼語言
          主站蜘蛛池模板: 昌图县| 赣榆县| 大英县| 辉南县| 武邑县| 永寿县| 永定县| 普安县| 长子县| 荆州市| 林周县| 砚山县| 尚志市| 双鸭山市| 攀枝花市| 盈江县| 息烽县| 壤塘县| 彝良县| 灌云县| 历史| 阿图什市| 都兰县| 错那县| 平果县| 全椒县| 庆云县| 克什克腾旗| 龙南县| 门头沟区| 西充县| 安丘市| 江口县| 繁昌县| 曲麻莱县| 舒兰市| 西林县| 卓尼县| 深州市| 石首市| 长沙县|