在尝试添加静态链接的Lua扩展时,出现了“检测到多个虚拟机”的Lua错误提示。

我有一个应用程序,其中包含静态链接的lua 5.2解释器(无法访问代码)。 当我尝试使用下面的代码撰写扩展程序时:

#define LUA_LIB
#define LUA_BUILD_AS_DLL
#include "lua.hpp"

extern "C"
{
    static int test(lua_State* state)
    {
        return 1;
    }

    static const struct luaL_Reg functions[] = {
        {"test", test},
        {NULL, NULL},
    };

    int __declspec(dllexport) luaopen_test(lua_State* state)
    {
        luaL_newlibtable(state, functions);
        luaL_setfuncs(state, functions, 0);
        return 0;
    }
}

并使用静态链接的lua52.lib进行编译。 当我尝试从lua代码中要求它时,我会遇到“检测到多个虚拟机”错误。 在这种情况下我该怎么办?

点赞
用户1442917
用户1442917

你不能使用静态链接的 lua52.lib 编译它,因为主应用程序会加载自己的版本的 lua52.lib,当该模块被“require”时,它会加载自己的副本,这会导致“检测到多个虚拟机”的消息。

使用静态编译的 VM 有两个选项(在 Windows 上):(1)静态包含所有模块,或者(2)对 Lua52.dll 编译您的模块,但是不包括实际的 DLL,而是包括一个“代理”DLL,该 DLL 将 Lua API 调用转发到静态编译的可执行文件中的方法(API 方法还需要在可执行文件中导出)。

请参阅此主题讨论页面了解如何编译可执行文件,以及代理 DLL 的 LuaProxyDllFour 页面

在 Linux 上,您不需要有一个代理库,但是您仍然需要使用 -Wl,-E 链接器选项避免将 Lua 解释器链接到库中,并通过导出可执行文件中的符号来实现;请参见 lhf 的回答以获取详细信息

2015-07-26 17:04:26