Как создать dll модуля Lua

Я пытаюсь написать внешний модуль Lua.

Я работаю над Windows 8.1, и я использую gcc как компилятор.

Мое требование состоит в том, чтобы собрать/скомпилировать все все самостоятельно, не используя предварительно скомпилированные файлы, доступные в Интернете.

Прежде всего, я строю исходный код C Lua 5.2.4 следующим образом:

  • 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;
}

то я скомпилирую его, ссылаясь на dynamic 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 ?
>

Что я делаю неправильно?

Большое спасибо заранее.

Ответ 1

Не связывайте библиотеку Lua с вашей DLL. Это сообщение об ошибке сообщает вам.

Ответ 2

Возможно, вам нужно определить SYSCFLAGS LUA_BUILD_AS_DLL, а затем снова скомпилировать код lua

gcc -DLUA_BUILD_AS_DLL -c *.c

Почему бы вам не использовать Makefile, который предоставляется источником Lua? Это простой способ справиться, если вы прочитали Makefile, он установил для вас gcc flags.

cd /path/to/lua-src
make mingw

теперь вы должны получить lua.exe, luac.exe, lua53.dll в /path/to/lua -src/src/

скомпилируйте свой модуль

gcc -shared -I/path/to/lua-src/src LuaMath.c -o LuaMath.dll -L/path/to/lua-src/src -llua53