我正在尝试编写一个外部 Lua 模块。
我在 Windows 8.1 上工作,我使用 gcc 作为编译器。
我的要求是自己构建/编译所有内容,而无需使用在线提供的预编译文件。
首先,我构建Lua 5.2.4的C源代码如下:
其中
X.X.X
是源代码修订版。一旦我创建了我的 .exe,我就编写了我的模块的 C 代码(我们称之为 LuaMath):
#include<windows.h>
#include<math.h>
#include "lauxlib.h"
#include "lua.h"
static int IdentityMatrix(lua_State *L)
{
int in = lua_gettop(L);
if (in!=1)
{
lua_pushstring(L,"Maximum 1 argument");
lua_error(L);
}
lua_Number n = lua_tonumber(L,1);
lua_newtable(L); /* tabOUT n */
int i,j;
for (i=1;i<=n;i++)
{
lua_newtable(L); /* row(i) tabOUT n */
lua_pushnumber(L,i); /* i row(i) tabOUT n */
for (j=1;j<=n;j++)
{
lua_pushnumber(L,j); /* j i row(i) tabOUT n */
if (j==i)
{
lua_pushnumber(L,1);
}
else /* 0/1 j i row(i) tabOUT n */
{
lua_pushnumber(L,0);
}
/* Put 0/1 inside row(i) at j position */
lua_settable(L,-4); /* i row(i) tabOUT n */
}
lua_insert(L,-2); /* row(i) i tabOUT n */
/* Insert row(i) into position in tabOUT */
lua_settable(L,2); /* tabOUT n */
}
return 1;
}
static const struct luaL_Reg LuaMath [] = {{"IdentityMatrix", IdentityMatrix},
{ NULL, NULL}};
int __declspec(dllexport) luaopen_LuaMath(lua_State *L)
{
luaL_newlib(L,LuaMath);
return 1;
}
然后我编译它链接到动态 library.dll 如下:
gcc -shared -L "<path where luaX.X.X.dll is>" -l "luaX.X.X" LuaMath.c
当我将模块调用为 Lua 代码时,如下所示:
require("LuaMath")
输出是:
> require("LuaMath")
multiple Lua VMs detected
stack traceback:
[C]: in ?
[C]: in function 'require'
stdin:1: in main chunk
[C]: in ?
>
我做错了什么?
提前谢谢了。
最佳答案
不要将 Lua 库与您的 DLL 链接。这就是错误消息告诉您的内容。
关于c - 如何创建Lua模块的dll,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43980470/