gpt4 book ai didi

c - Lua 5.2 C API 和要求

转载 作者:太空狗 更新时间:2023-10-29 17:19:19 26 4
gpt4 key购买 nike

问题

我想从 C 程序调用 require()s lyaml 模块的 Lua 脚本,LibYAML 的 Lua 绑定(bind)。

我从源代码编译了 Lua 5.2,并修改了模块以使其与 Lua 5.2 一起工作。它可以在 github 上找到.

Lua 脚本如下,它适用于 Lua 5.1 和 5.2:

-- foo.lua
require('lyaml')

function hello ()
res = lyaml.load("a: 4\n")
return res.a
end

-- then calling hello() it works like a charm
print( hello() ) -> 4


问题

我写了一个 C 程序,应该从脚本中调用 hello(),遵循 Programming in Lua, Chapter 25Lua 5.2 Reference Manual .

C 程序如下:

/* foo.c */
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>

int main(void)
{
double z;

lua_State *L = luaL_newstate();
luaL_openlibs(L);

if (luaL_dofile(L, "foo.lua"))
luaL_error(L, "error running script: %s", lua_tostring(L, -1));

lua_getglobal(L, "hello");

if (lua_pcall(L, 0, 1, 0) != 0)
luaL_error(L, "error calling hello: %s", lua_tostring(L, -1));

if (!lua_isnumber(L, -1))
luaL_error(L, "result must be number");

z = lua_tonumber(L, -1);
lua_pop(L, 1);

lua_close(L);
return 0;
}

我编译发行:

gcc -Wall -o foo foo.c -ldl -lm -llua

然后在运行 foo 时,我在运行时收到以下错误:

PANIC: unprotected error in call tu Lua API (
error running script: error loading module 'lyaml' from file '/path/to/lyaml.so':
/path/to/lyaml.so: undefined symbol: lua_gettop)
Aborted

所以我尝试从 C 程序加载 lyaml,在 luaL_openlibs() 调用之后添加以下行:

luaL_requiref(L, "lyaml", luaopen_package, 1);

重新编译后错误变为:

PANIC: unprotected error in call tu Lua API (
error running script:
hello.lua:4: attempt to index global 'lyaml' (a nil value))
Aborted

所以我想象没有 lyaml 符号并且 require() 调用以某种方式失败。

通过阅读 luaL_requiref() 文档,我认为 modname 将通过其调用将 glb 标志设置为 true 来设置:

void luaL_requiref (lua_State *L, const char *modname, 
lua_CFunction openf, int glb);

Calls function openf with string modname as an argument and sets the call result in package.loaded[modname], as if that function has been called through require.

If glb is true, also stores the result into global modname.
Leaves a copy of that result on the stack.

我尝试在 Lua 脚本中注释 require() 调用,结果是一样的。

问题

我做错了什么?我是不是忘记做某事了?


编辑

我破解了模块更新弃用(删除)的函数/类型,如下所示:

lua_strlen() -> luaL_len()
luaL_reg -> luaL_Reg
luaL_getn() -> luaL_len()

但是使用 lyaml 的 Lua 脚本可以工作,所以我认为问题不是我的 hack。

我用 Lua 5.1 尝试了原始的 lyaml 模块。结果是一样的,所以我确定问题不是我的 hack。

更新

按照 Doug Currie 在其回答中的建议添加以下行,C 程序可与 Lua 5.1 完美配合。不过,我在 5.2 中仍然遇到同样的错误。

lyaml = require('lyaml')

最佳答案

foo.lua 只在 Lua 5.1.x 中运行——你被黑的 lyaml.c 没有设置全局 lyaml 在 Lua 5.2 中也不需要。我怀疑当你运行第一个测试时你的 PATH 没有 Lua 5.2 “工作得很好”,或者你在加载 foo.lua 之前手动设置了 lyaml

foo.lua 应该以

开头
lyaml = require('lyaml')

关于c - Lua 5.2 C API 和要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11485911/

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