加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

lua5.2的错误:检测到多个Lua VM

发布时间:2020-12-14 21:45:05 所属栏目:大数据 来源:网络整理
导读:我最近用5.2学习,我想尝试这样做: 第1步,为lua构建一个c模块: #include "lua.h"#include "lauxlib.h"#include "lualib.h"#include stdlib.hstatic int add(lua_State *L) { int x = luaL_checkint(L,-2); int y = luaL_checkint(L,-1); lua_pushinteger(L,
我最近用5.2学习,我想尝试这样做:

第1步,为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编译并链接它,我确信它在lua脚本中运行良好,例如“require(”tool“)tool.add(1,2)”

第2步,我写了另一个想要在步骤1中要求我的c模块的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 foundn");
        return 2;
    }
    lua_pushstring(L,"tool");
    if (lua_pcall(L,1,0) != LUA_OK) {
        printf("require_fail=%sn",lua_tostring(L,-1));
        return 3;
    }
    lua_getfield(L,-1,"add");
    lua_pushinteger(L,2);
    lua_pushinteger(L,3);
    lua_pcall(L,2,0);
    int n = luaL_checkint(L,-1);
    printf("n=%dn",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中构建的方式.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读