обнаружено несколько виртуальных машин Lua

Я использую бинарный файл Lua52.exe, который вы можете скачать с сайта Lua. Я хочу расширить его функциональность с помощью DLL, которую я пишу. Поэтому я написал DLL, включив исходный код Lua в свой проект VS DLL. Этот код ниже. Когда я делаю следующее в файле lua, который я запускаю через Lua52.exe, я получаю сообщение об ошибке «обнаружено несколько виртуальных машин Lua». Таким образом, Lua52.exe поставляется с lua52.dll, поэтому я предполагаю, что он динамически связан, и при запуске он загружает lua52.dll, чтобы запустить виртуальную машину lua. Когда моя DLL загружается, я подозреваю, что переданный lua_State исходит от lua52.exe. О чем говорит ВМ? Должен ли я динамически связываться с lua в моей DLL? Могу ли я сделать так, чтобы моя DLL НЕ создавала виртуальную машину lua? Я имею в виду, что я не делаю это сам, поэтому что-то в источнике lua должно быть.

package.loadlib("LuaDLLTest.dll", "luaopen_msglib")()


#define DLL_EXPORT extern "C" __declspec(dllexport)

#include "lua.hpp"

#define PI (3.14159265358979323846)

static int miles_to_km(lua_State *L)
{
    double miles = luaL_checknumber(L, 1);
    double km = miles * 1.609;
    lua_pushnumber(L, km);
    return 1;   /* one result */
} /* end of miles_to_km */

static int circle_calcs(lua_State *L)
{
    double radius = luaL_checknumber(L, 1);
    double circumference = radius * 2 * PI;
    double area = PI * radius * radius;
    lua_pushnumber(L, circumference);
    lua_pushnumber(L, area);
    return 2;   /* one result */
} /* end of miles_to_km */

static const luaL_Reg testlib[] =
{
    { "miles_to_km", miles_to_km },
    { "circle_calcs", circle_calcs },
    { NULL, NULL }
};


/*
** Open msg library
*/
DLL_EXPORT int luaopen_msglib(lua_State *L)
{
    lua_newtable(L);
    luaL_setfuncs(L, testlib, 0);
    lua_setglobal(L, "Math");

    return 1;
}

person user441521    schedule 24.02.2015    source источник
comment
Двоичные модули lua не должны компоноваться с самим lua. В Windows это сложнее, чем в других системах, и я думаю, вам нужно связать с идентичной lua dll двоичного файла lua, который будет запускать ваш модуль.   -  person Etan Reisner    schedule 24.02.2015
comment
Итак, в основном вы говорите сделать msdn.microsoft.com/en-us/library /ms810279.aspx ? Я запутался. Или вы имеете в виду динамическую ссылку в моем проекте DLL, потому что это должно загружать ту же lua52.dll, которую использует lua53.exe.   -  person user441521    schedule 24.02.2015
comment
Я так не думаю. Ваш модуль вообще не должен загружать lua напрямую. Помогает ли это?   -  person Etan Reisner    schedule 24.02.2015
comment
Итак, да, это файл динамической библиотеки, которого у меня нет. Не уверен, должен ли я сделать это сам из источника или что.   -  person user441521    schedule 24.02.2015
comment
Двоичный файл lua/и т.д. вы установили, должен был иметь один. Нет? Или ты тоже это сам построил?   -  person Etan Reisner    schedule 24.02.2015
comment
Не файл .lib нет. У него есть DLL, но ему нужен .lib для компиляции моей DLL. У меня все заработало с этим (получил файл .lib). Интересно, что 1 виртуальная машина внутри lua.dll теперь разделена между exe и моей DLL. ты   -  person user441521    schedule 24.02.2015


Ответы (1)


Пока lua52.exe и ваша DLL связаны с одной и той же DLL, вы не должны увидеть эту ошибку. Эта ошибка может произойти в двух случаях: (1) lua52.exe включает в себя интерпретатор Lua (Lua VM), статически скомпилированный, и когда ваш модуль загружает VM из lua52.dll, для которого он скомпилирован, вы получаете сообщение «обнаружено несколько Lua VM». (2) lua52.exe скомпилирован с lua52.dll, а ваш модуль скомпилирован с другой dll, которая включает в себя Lua VM. Оба в конечном итоге загружаются (аналогично первому случаю), что вызывает ошибку.

Сначала вам нужно выяснить, действительно ли lua52 связан с lua52.dll. Вы можете просто проверить его размер (DLL составляет 180 КБ, а исполняемый файл — 14 КБ на моем компьютере с Windows) или запустить что-то вроде зависит, чтобы увидеть зависимости. Если вы подтвердите, что он связан с lua52.dll, и ваш модуль связан с той же DLL, я ожидаю, что это сработает. Я протестировал аналогичную библиотеку, используя ту же команду, что и вы (package.loadlib("socket/core.dll", "luaopen_socket_core")()), и она загружается без ошибок.

person Paul Kulchenko    schedule 24.02.2015