我正在尝试编写外部Lua模块。
我在Windows 8.1上工作,我使用gcc作为编译器。
我的要求是自己构建/编译所有内容,而无需使用在线提供的预编译文件。
首先,我按如下方式构建了Lua 5.2.4的C源代码:
gcc -c * .c
ren lua.o lua.obj
ren luac.o luac.obj
ar rcs luaX.X.X.lib * .o
gcc -shared -o luaX.X.X.dll * .o
gcc lua.c luaX.X.X.lib -o luaX.X.X.exe
gcc luac.c luaX.X.X.lib -o luacX.X.X.exe
del * .o * .obj
其中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 ?
>
我做错了什么?
非常感谢提前。
答案 0 :(得分:4)
不要将Lua库与DLL链接。这就是错误消息告诉你的内容。
答案 1 :(得分:0)
可能需要定义一个SYSCFLAGS LUA_BUILD_AS_DLL
然后再次编译lua代码
gcc -DLUA_BUILD_AS_DLL -c *.c
为什么不使用由Lua源提供的Makefile?这是一种简单的编译方法,如果您阅读Makefile,它会为您设置gcc标志。
cd /path/to/lua-src
make mingw
现在你应该在/ path / to / lua-src / src /
中获取lua.exe,luac.exe,lua53.dll编译你的模块
gcc -shared -I/path/to/lua-src/src LuaMath.c -o LuaMath.dll -L/path/to/lua-src/src -llua53