我正在尝试编写一个外部 Lua 模块。

我在 Windows 8.1 上工作,我使用 gcc 作为编译器。

我的要求是自己构建/编译所有内容,而无需使用在线提供的预编译文件。

首先,我构建Lua 5.2.4的C源代码如下:

  • gcc -c *.c
  • 任 lua.o lua.obj
  • 任 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 ?
    >
    

    我做错了什么?

    提前谢谢了。

    最佳答案

    不要将 Lua 库与您的 DLL 链接。这就是错误消息告诉您的内容。

    关于c - 如何创建Lua模块的dll,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43980470/

    10-13 03:32