如何创建Lua模块的DLL

时间:2017-05-15 13:11:00

标签: c lua

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

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

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

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

  1. gcc -c * .c

  2. ren lua.o lua.obj

  3. ren luac.o luac.obj

  4. ar rcs luaX.X.X.lib * .o

  5. gcc -shared -o luaX.X.X.dll * .o

  6. gcc lua.c luaX.X.X.lib -o luaX.X.X.exe

  7. gcc luac.c luaX.X.X.lib -o luacX.X.X.exe

  8. del * .o * .obj

  9. 其中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 ?
    >
    

    我做错了什么?

    非常感谢提前。

2 个答案:

答案 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