編譯Lua以及編寫動態擴充

來源:互聯網
上載者:User
文章目錄
  • 1         前言
  • 2         Visual Studio 環境下的編譯
  • 3         Code::Blocks + GCC ( MinGW )環境下的編譯
  • 4         編寫簡單的擴充
  • 5         後記

1         前言

Lua 基本的編譯說明在原始碼包裡的 INSTALL 檔案中已經講得很清楚,這裡重點講的是如何在 IDE 環境下面編譯。

2         Visual Studio 環境下的編譯

建立一個解決方案“ lua ”,其中包含三個項目:兩個控制台項目“ lua ”和“ luac ”,一個 dll 項目“ lua51”,按照 INSTALL 檔案中的方法把源檔案加到三個項目中,具體增加哪些檔案其實很好記,“ lua51 ”項目去掉“ lua.c ”、“ luac.c ”和“ print.c ”,“ lua ”項目只需要“ lua.c ”,“ luac ”項目需要“ luac.c ”和“print.c ”。

項目依賴性為:“ lua ”和“ luac ”都依賴於“ lua51 ”。

在三個項目選項中必須加入自訂編譯選項“ /DLUA_BUILD_AS_DLL ”!否則編譯出來的 DLL 沒有任何匯出函數(這是因為在“ luaconfig.h ”標頭檔中,“ LUA_BUILD_AS_DLL ”宏控制了“ __declspec(dllexport)”和“ __declspec(dllimport) ”的定義, VS 編譯器在編譯 DLL 時候需要這個定義,而 GCC 不需要)。

使用 VS 編譯器,“ luac ”連結會不通過,提示找不到某些函數的定義,這其實是 BUG ,可以使用 SVN 下載最新的 lua 原始碼解決,不過使用 GCC 是更好的方法。

3         Code::Blocks + GCC ( MinGW )環境下的編譯

上面說到使用 GCC 是更好的方法,另一個原因是可以避免 Visual Studio 不同版本的 God Damned Fucking VC運行時問題(參見“ http://blog.koroirc.com/2008/06/visual-cpp-woes/ ”,靜態串連可以解決這個問題,但是編譯出來的檔案要大一些,而且想想每一個編譯出來的 exe 、 dll 中都塞著同樣的代碼,就很不爽!)。

在 CB ( http://www.codeblocks.org/ )中建立解決方案和項目的方式差不多( CB 中),依賴性可以不用設定,直接調整項目的上下順序即可( lua51 項目排在最上面),如果要設定依賴性,在任意一個項目的屬性中設定:

圖 3 ‑ 1 CB 中設定項目依賴性

“ lua51 ”項目屬性中,目標檔案名要注意改一下,把“ lib ”首碼去掉:

圖 3 ‑ 2 去掉 DLL 項目目標檔案的首碼

“ lua ”和“ luac ”項目的編譯選項種中要加入對 lib 庫的連結:

圖 3 ‑ 3 加入 lua51 的連結庫

這樣就可以編譯了,編譯出來的 lua.exe 、 luac.exe 和 lua51.dll 相當小,因為都動態連結到了“ msvcrt.dll”上,而不是那些噁心的“ msvcrXX.dll ”。

圖 3 ‑ 4 依賴性

4         編寫簡單的擴充

參考 http://blog.csdn.net/wzhwkent/archive/2009/07/20/4363367.aspx ,我這裡把內容進行了化簡。

事實上就是編寫一個 lua 能認的 dll ,在 GCC 環境下一切都是那麼地簡單:需要匯出的函數或變數前面加上“extern ”關鍵字(不加也可以),不需要匯出的,加上“ static ”關鍵字 - 標準 C 規範!

#include "../src/lua.h"

#include "../src/lualib.h"

#include "../src/lauxlib.h"

#include <math.h>

 

static int l_sin (lua_State *L) {

    double d = luaL_checknumber(L, 1);

    lua_pushnumber(L, sin(d));

    return 1; /* number of results */

}

 

static struct luaL_reg lrLibs[] = {

    { "sin", l_sin

    }, { NULL, NULL } /* sentinel */

};

 

extern int luaopen_mylib( lua_State* L ) {

    luaL_register( L, "mylib", lrLibs );

    return 1;

}

編譯出來的 DLL 同樣非常小!

圖 4 ‑ 1 依賴性

圖 4 ‑ 2 程式大小

寫一個簡單的 lua 指令碼執行一下:

require("mylib");

print(mylib.sin(10));

執行結果:

D:/Lua/Release>lua test.lua

-0.54402111088937

Well done!

5         後記

還是 Linux 下面的那套規則爽,不過按照微軟一貫的“簡單問題複雜化”的思路,也正常,呵呵

http://blog.csdn.net/shajunxing/article/details/5131069

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.