自己寫 lua module (Building lua module)

背景

學了一段時間lua,由於luacom不支持gbk,所以想做一個gbk轉換成utf-8的模塊。但是不會寫模塊怎麼辦?學!

目標

創建一個calc模塊,輸出兩個函數 sum和average,最後在lua程序想這樣用:

require "calc"
a = 5
b = 10
print(calc.sum(a,b))
print(calc.average(a,b))


學習過程簡述

學習總結

require("xxx") 函數在調用C模塊時,會在cpath中查找 xxx.dll文件,若找到則調用 luaopen_xxx函數, luaopen_xxx 函數也必須 luc_CFunction 類型的。

用戶可以在luaopen_xxx函數中用capi做任何事情,但一般是用luaL_register註冊一組函數到一個table中,並返回這個table


配置lua編譯環境


  1. 安裝luaforwindows
  2. 打開vs2008,工具->選項->項目和解決方案->VC++目錄
    • 右上角選擇 包含文件,添加luaforwindows安裝目錄中的include目錄,比如 C:\Program Files\Lua\5.1\include
    • 右上角選擇 庫文件,添加luaforwindows安裝目錄中lib目錄,比如 C:\Program Files\Lua\5.1\lib

生成calc模塊


新建工程

打開vs2008,新建 -> 項目 -> Visual C++ -> Win32 -> Win32項目 -> 輸入項目名 calc

應用程序類型:DLL
附加選項:空項目

添加庫引用

右上角選擇 所有配置
配置屬性 -> 鏈接器 -> 附加依賴項 -> 輸入 lua51.lib


添加源文件

添加一個新的文件 calc.c (注意是 .c 不是.cpp ),源代碼如下:

//包含3個lua頭文件
//如果本文件是cpp文件,則不要包含下面3個文件,而包含 lua.hpp 文件
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>

static int sum(lua_State *L) {
	lua_Number a = luaL_checknumber(L, 1);  //檢查第1個參數是數字,如果是則返回這個數字
	lua_Number b = luaL_checknumber(L, 2);  //檢查第2個參數是數字,如果是則返回這個數字

	lua_pushnumber(L, a+b); //返回值
	return 1; //函數返回值個數
}

static int average(lua_State *L) {
	lua_Number a = luaL_checknumber(L, 1);  //檢查第1個參數是數字,如果是則返回這個數字
	lua_Number b = luaL_checknumber(L, 2);  //檢查第2個參數是數字,如果是則返回這個數字

	lua_pushnumber(L, (a+b)/2); //返回值
	return 1; //函數返回值個數
}

static luaL_Reg module_functions[] = {
	{"sum", sum}, //函數名,函數
	{"average", average},
	{NULL, NULL} //結尾
};

//注意用__declspec(dllexport)輸出函數
//如果本文件是 cpp 文件,則必須加extern "C"
__declspec(dllexport) int luaopen_calc(lua_State *L) {
	luaL_register(L, "calc", module_functions); //創建一個全局的calc table,所有函數都會按照指定名稱註冊成calc table的成員函數
	return 1; //luaopen_calc也是一個luc_CFunction,返回返回值的個數,返回值是由luaL_register壓入棧的
}

生成並測試

生成release版的calc.dll,然後在calc.dll所在目錄,新建一個 test.lua文件,把本文目標(上面)中的lua源程序拷進去,運行!結果正確!!

如果需要長期使用calc.dll,則可以將它拷貝到luaforwindows的clibs文件夾中,比如C:\Program Files\Lua\5.1\clibs


到此爲止,我們已經掌握了用VS寫lua C模塊的基本方法了,下一篇文章,講講自己讓luacom能夠打開中文的word文件。



發佈了52 篇原創文章 · 獲贊 5 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章