Lua 核心極小,標準庫 (io、string、math、table) 均以 C 模組形式實現並編譯進 lua.dll。自訂模組流程:
luaL_Reg 陣列映射 Lua 函數名 → C 函數int func(lua_State *L))luaopen_xxx 註冊模組.so/.dll) 放入 package.cpath 路徑mymathlib 提供 sin#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
#include
static int mysin(lua_State *L) {
double d = luaL_checknumber(L, 1); // 取第 1 參數,類型檢查
lua_pushnumber(L, sin(d)); // 推回傳值
return 1; // 回傳值個數
}
static const struct luaL_Reg mymathlib[] = {
{"sin", mysin},
{NULL, NULL}
};
__declspec(dllexport) int luaopen_mymathlib(lua_State *L) {
luaL_register(L, "mymathlib", mymathlib); // Lua 5.1 風格
return 1;
}
Lua 測試:
require "mymathlib"
print(mymathlib.sin(0.5))
核心課題:C++ 物件 ↔ Lua userdata 綁定
userdata 存放 C++ 物件指標metatable,設定 __index = metatable (方法查找回環)__gc 元方法處理 C++ 物件銷毀| 工具 | 技術路線 | 特點 |
|---|---|---|
| toLua++ | 預處理掃描標頭檔 → 產生綁定碼 | 直觀、支援多態/繼承/複雜成員、產生碼量大 |
| LuaBind | C++ 模板元程式設計 | 型別安全、編譯期檢查、學習曲線陡峭 |
| sol2 (現代推薦) | C++17 模板、表達式模板 | 零開銷抽象、語法優雅、支援 Lua 5.1~5.4 |
__index 指向父類 metatable,形成查找鏈。關鍵字標記:
{ module_begin = "LUACBIND_MODULE_BEGIN", module_end = "LUACBIND_MODULE_END",
method_begin = "LUACBIND_METHOD_BEGIN", method_end = "LUACBIND_METHOD_END" }
流程:parser.lua 掃描標頭檔 → 產生綁定碼 → main 註冊 → Lua 可用。
兩種架構:
debug 庫,無棧平衡煩惱。lua_newthread 建立獨立協程作為除錯上下文,隔離主執行緒。lua_sethook 設定 LUA_MASKLINE | LUA_MASKCALL | LUA_MASKRET。lua_yield 暫停協程。longjmp 導致 C 棧框架展開,後續 C 代碼不再執行。須在 yield 前完成所有狀態捕獲。