我的应用程序包含静态链接的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"错误.在这种情况下我能做些什么?
您无法使用静态链接的lua52.lib编译它,因为主应用程序加载其自己的lua52.lib版本,当此模块为"required"时,它会加载自己的副本,这会导致"检测到多个VM"消息.
使用静态编译的VM,您有两个选项(在Windows上):( 1)静态包含所有模块,或(2)针对Lua52.dll编译模块,但是实际的DLL包含一个"代理"DLL,它将转发Lua API调用静态编译的可执行文件中的方法(API方法也需要在可执行文件中导出).
有关如何编译可执行文件以及代理DLL的LuaProxyDllFour页面的讨论,请参阅此主题.
在Linux上,您不需要拥有代理库,但仍需要避免将Lua解释器链接到库中,并使用-Wl,-E链接器选项从可执行文件中导出符号; 有关详细信息,请参阅lhf的答案.