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

Ale*_*kii 4 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

并使用静态链接的lua52.lib进行编译.当我试图从lua代码中要求它时,我收到"检测到多个vms"错误.在这种情况下我能做些什么?

Pau*_*nko 6

您无法使用静态链接的lua52.lib编译它,因为主应用程序加载其自己的lua52.lib版本,当此模块为"required"时,它会加载自己的副本,这会导致"检测到多个VM"消息.

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

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

在Linux上,您不需要拥有代理库,但仍需要避免将Lua解释器链接到库中,并使用-Wl,-E链接器选项从可执行文件中导出符号; 有关详细信息,请参阅lhf的答案.