Lua-“是的;“检测到多个虚拟机”;尝试为静态链接的Lua添加扩展时

Lua-“是的;“检测到多个虚拟机”;尝试为静态链接的Lua添加扩展时,lua,Lua,我有一个包含静态链接的Lua5.2InteperPreter的应用程序(并且无法访问代码)。 当我尝试使用下一个代码编写扩展时: #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 functio

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

#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代码中请求时,我收到了“检测到多个VM”错误。
在这种情况下我能做什么?

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

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

有关如何编译可执行文件以及代理DLL的页面,请参见

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