gpt4 book ai didi

lua5.2的错误: multiple Lua VMs detected

转载 作者:行者123 更新时间:2023-12-04 20:00:36 29 4
gpt4 key购买 nike

我最近使用5.2进行学习,我想这样尝试:

第一步,为lua构建一个c模块:

#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
#include <stdlib.h>

static int add(lua_State *L) {
int x = luaL_checkint(L, -2);
int y = luaL_checkint(L, -1);
lua_pushinteger(L, x + y);
return 1;
}

static const struct luaL_Reg reg_lib[] = {
{"add", add}
};

int luaopen_tool(lua_State *L) {
luaL_newlib(L, reg_lib);
lua_setglobal(L, "tool");
return 0;
}

我用liblua.a编译并链接它,我确信它在像“require(”tool“)tool.add(1,2)”这样的lua脚本中运行良好

第 2 步,我编写了另一个 C 程序,它希望在第 1 步中需要我的 c 模块,如下所示:
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
#include <stdlib.h>

int main(int argc, char* const argv[]) {
lua_State *L = luaL_newstate();
luaL_requiref(L, "base", luaopen_base, 1);
luaL_requiref(L, "package", luaopen_package, 1);
lua_getglobal(L, "require");
if (!lua_isfunction(L, -1)) {
printf("require not found\n");
return 2;
}
lua_pushstring(L, "tool");
if (lua_pcall(L, 1, 1, 0) != LUA_OK) {
printf("require_fail=%s\n", lua_tostring(L, -1));
return 3;
}
lua_getfield(L, -1, "add");
lua_pushinteger(L, 2);
lua_pushinteger(L, 3);
lua_pcall(L, 2, 1, 0);
int n = luaL_checkint(L, -1);
printf("n=%d\n", n);
return 0;
}

我也用 liblua.a 编译和链接,但是当我运行它时出现错误:
“require_fail=检测到多个 Lua VM”

有人的博客说,在lua5.2中,你应该动态链接c模块和c宿主程序,而不是静态链接。

有没有人有同样的问题,或者我的代码有问题,谢谢。

注意:

通过使用-Wl,-E编译主程序已经解决了这个问题,非常感谢您的帮助^^。

最佳答案

当您从中创建 .so 时,不要将您的 C 模块与 liblua.a 链接。例如,请参阅我的 Lua 库页面:http://www.tecgraf.puc-rio.br/~lhf/ftp/lua/ .您可以将 liblua.a 静态链接到您的主程序,但您必须通过添加 -Wl,-E 来导出其符号。在链接时。这就是 Lua 解释器在 Linux 中的构建方式。

关于lua5.2的错误: multiple Lua VMs detected,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14213559/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com