我写了以下C文件(针对Lua5.1) bar_src.c
#include <lua5.1/lua.h>
#include <lua5.1/lauxlib.h>
#include <lua5.1/lualib.h>
static int foo(lua_State *L)
{
int a = luaL_checknumber(L, 1);
int b = luaL_checknumber(L, 2);
lua_pushnumber(L, a + b);
return 1;
}
luaL_Reg foolib[] = {
{"foo", foo},
{NULL, NULL}
};
int luaopen_bar(lua_State *L)
{
luaL_register(L, "bar", foolib);
return 1;
}并编译为:gcc -shared -fpic -o bar.so bar.c -llua5.1。然而,每当我尝试在lua中运行require("bar")时,它立即执行segmentation fault (core dumped)。
我想在另一个系统上试用,所以我在repl.it (运行在Ubuntu18.04上)上做了同样的事情,一切都运行得很好,这意味着我的Linux配置有一个问题。
编辑:我在/var/lib/systemd/coredump中找到了段错误的核心转储,并使用gdb $(which lua) /var/lib/systemd/coredump/core.lua.[file]将其加载到GDB中,gdb说:
Core was generated by `lua'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x00005620820f3ad3 in lua_pushvalue ()发布于 2021-08-17 10:53:21
问题是我使用的是Lua5.4解释器,我应该用lua5 .1命令来运行它。
在本例中,我使用了旧版本的Lua,Lua 5.1,但是Lua的arch包安装了5.1、5.2、5.3和最新的5.4。虽然5.4的文档不多,但有一本参考手册。编译器说luaL_register函数不在Lua 5.4中,但我找到了一个叫做luaL_newlib() in the manual的替代函数。
我更改了我的代码,如下所示:
#include <lua5.1/lua.h>
#include <lua5.1/lauxlib.h>
#include <lua5.1/lualib.h>
static int foo(lua_State *L)
{
int a = luaL_checknumber(L, 1);
int b = luaL_checknumber(L, 2);
lua_pushnumber(L, a + b);
return 1;
}
luaL_Reg foolib[] = {
{"foo", foo},
{NULL, NULL}
};
int luaopen_bar(lua_State *L)
{
luaL_newlib(L, foolib);
return 1;
}这段代码编译得很好,当我required它时,没有段错误。
https://stackoverflow.com/questions/68809493
复制相似问题