我們從頭開始講起怎麼爲lua寫一個C語言函數庫。
首先去下載源代碼,我這裏選擇的是5.3.5版本的源代碼。然後去安裝好mingw64編譯工具。
我們將lua源代碼解壓,進入源代碼目錄,打開命令行,輸入 make mingw
。
在命令make mingw
運行完畢後,我們會得到一系列的.o
、.a
等文件,還有luac
、lua
,lua53.dll
或者lua53.so
(取決於你的系統,我這裏用的windows系統,所以是dll)。
我們用到的文件基本上就是liblua.a
這個文件。
#include <math.h>
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
// 適配windows 和 linux 系統
#ifndef LUA_LIB_API
#ifdef _WIN32
#define LUA_LIB_API __declspec(dllexport)
#else
#define LUA_LIB_API __attribute__ ((visibility ("default")))
#endif
#endif
// 一個簡單的sin函數
static int l_sin (lua_State * L) {
double d = luaL_checknumber(L, 1);
lua_pushnumber(L, sin(d));
return 1;
}
// 函數表
static const struct luaL_Reg mylib[] = {
{"lsin", l_sin},
{NULL, NULL}
};
LUA_LIB_API int luaopen_mylib (lua_State *L) {
// 將函數註冊到一個table中
lua_newtable(L);
luaL_setfuncs(L, mylib, 0);
return 1;
}
輸入命令gcc .\mylib.c liblua.a -I E:\libs\lua-5.3.5\src -fPIC -shared -o mylib.dll -Wall
進行編譯。 其中-I
後面是lua源代碼所在,爲了方便起見,我已經將liblua.a
文件拷貝到了當前目錄中。
上述命令結束後,我們會得到一個mylib.dll
文件,我們就可以正常使用這個庫了。
E:\lua>lua
Lua 5.3.5 Copyright (C) 1994-2018 Lua.org, PUC-Rio
> mylib = require "mylib"
> mylib.lsin(30)
-0.98803162409286
>
需要注意的是,luaopen_mylib
下劃線後面的部分必須和文件名一致,luaopen_mylib
對應於mylib.dll
或者mylib.so
。