2

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

1 回答 1

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)或运行类似的程序来查看依赖关系如果您确认它与 lua52.dll 链接,并且您的模块与同一个 DLL 链接,我希望它可以工作。我使用与您使用 ( package.loadlib("socket/core.dll", "luaopen_socket_core")()) 相同的命令在类似的库上进行了测试,并且加载时没有错误。

于 2015-02-24T17:17:02.437 回答