文章目錄
- 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