多个Lua虚拟机';检测到

多个Lua虚拟机';检测到,lua,lua-api,Lua,Lua Api,我使用的是Lua52.exe二进制文件,您可以从Lua的网站下载。我想用我编写的DLL扩展它的功能。因此,我编写了一个DLL,其中包括了我的VS DLL项目中的Lua源代码。代码如下。在通过Lua52.exe运行的lua文件中执行以下操作时,会出现错误“检测到多个lua VM”。所以Lua52.exe附带了Lua52.dll,所以我假设它是动态链接的,当它启动时,它会加载Lua52.dll以启动luavm。加载DLL时,我怀疑传入的lua_状态来自lua52.exe。虚拟机在谈论什么?我必须动态

我使用的是Lua52.exe二进制文件,您可以从Lua的网站下载。我想用我编写的DLL扩展它的功能。因此,我编写了一个DLL,其中包括了我的VS DLL项目中的Lua源代码。代码如下。在通过Lua52.exe运行的lua文件中执行以下操作时,会出现错误“检测到多个lua VM”。所以Lua52.exe附带了Lua52.dll,所以我假设它是动态链接的,当它启动时,它会加载Lua52.dll以启动luavm。加载DLL时,我怀疑传入的lua_状态来自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;
}

只要lua52.exe和您的DLL链接到同一个DLL,您就不会看到此错误。此错误可能发生在两种情况下:(1)lua52.exe包括静态编译的Lua解释器(Lua VM),当您的模块从编译它的lua52.dll加载VM时,您会收到“检测到多个Lua VM”消息。(2) lua52.exe是根据lua52.dll编译的,您的模块是根据另一个包含luavm的dll编译的。这两种情况都会加载(类似于第一种情况),从而触发错误


首先,您需要弄清楚lua52是否确实与lua52.dll链接。您可以简单地检查它的大小(在我的Windows计算机上,DLL是180K,exe是14K),或者运行类似的程序来查看依赖项。如果您确认它是针对lua52.dll链接的,并且您的模块是针对同一个dll链接的,我希望它能够工作。我使用与您使用的命令相同的命令在一个类似的库上进行了测试(
package.loadlib(“socket/core.dll”、“luaopen\u socket\u core”)()
),加载时没有错误。

lua二进制模块不得与lua自身链接。在Windows上,这比在其他系统上要困难得多,我认为您需要针对运行模块的lua二进制文件的相同lua dll进行链接?我很困惑。或者你的意思是在我的DLL项目中做一个动态链接,因为它应该加载lua53.exe正在使用的同一个lua52.DLL。我不这么认为。您的模块根本不应该直接加载lua。有帮助吗?好的,这是动态库文件,我没有。我不确定我是否必须自己从源代码或什么。你安装的lua二进制文件/等等应该有一个。不还是你自己建造的?