Lua - "检测到多个vms"同时尝试为静态链接的Lua添加扩展名

时间:2015-07-26 16:46:40

标签: lua

我的应用程序包含静态链接的lua 5.2 inteperpreter(并且无法访问代码)。 当我尝试使用下一个代码编写扩展时:

#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编译它。 我得到了#34;检测到多个vms"当我试图从lua代码中要求它时出错。 在这种情况下我能做些什么?

1 个答案:

答案 0 :(得分:6)

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

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

请参阅this thread for the discussion有关如何编译可执行文件和LuaProxyDllFour代理DLL页面的信息。

在Linux上,您不需要拥有代理库,但仍需要避免将Lua解释器链接到库中,并使用-Wl,-E链接器选项从可执行文件中导出符号; see lhf's answer for details