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