检测到多个Lua VM

时间:2015-02-24 16:31:25

标签: lua lua-api

我正在使用您可以从Lua网站下载的Lua52.exe二进制文件。我想用我编写的DLL来扩展它的功能。所以我写了一个DLL,其中我将Lua源包含在我的VS DLL项目中。该代码如下。当我在通过Lua52.exe运行的lua文件中执行以下操作时,我收到错误“检测到多个Lua VM”。因此Lua52.exe附带lua52.dll所以我认为它是动态链接的,当它启动时它会加载lua52.dll以启动lua VM。当我的DLL被加载时,我怀疑传入的lua_State来自lua52.exe。虚拟机谈的是什么?我是否必须动态链接到我的DLL中的lua?我可以让我的DLL不以某种方式创建一个lua VM吗?我的意思是我不是靠自己做的,所以在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;
}

1 个答案:

答案 0 :(得分:2)

只要lua52.exe和您的DLL链接到同一个DLL,就不应该看到此错误。在以下两种情况下可能会发生此错误:(1)lua52.exe包含静态编译的Lua解释器(Lua VM),当您的模块从lua52.dll加载VM时,它会被编译,您将获得多个Lua VM检测"信息。 (2)lua52.exe是针对lua52.dll编译的,你的模块是针对另一个包含Lua VM的dll编译的。最终都加载(类似于第一种情况),这会触发错误。

首先,您需要弄清楚lua52是否确实与lua52.dll相关联。你可以简单地检查它的大小(我的Windows机器上的DLL是180K,exe是14K)或运行类似depends的东西来查看依赖项。如果您确认它与lua52.dll相关联,并且您的模块已链接到同一个DLL,我希望它可以正常工作。我使用与您使用相同的命令(package.loadlib("socket/core.dll", "luaopen_socket_core")())在类似的库上进行了测试,并且它的加载没有错误。