【发布时间】:2021-09-06 13:33:55
【问题描述】:
我的环境是Lua-5.4.2 Luasocket-3.0-rc1。 当我直接运行 lua 脚本时,它工作成功。 当我通过c语言运行它时,它告诉我错误。
错误消息是: PANIC:调用 Lua API 时出现未受保护的错误(错误运行脚本:错误从文件“/usr/local/lib/lua/5.4/socket/core.so”加载模块“socket.core”:未定义符号:lua_gettop) 中止(核心转储)
有人知道为什么吗?
lua脚本代码为:(test.lua)
#!/usr/local/bin/lua
local socket = require("socket")
print(socket._VERSION)
c代码是:(main.c)
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
int main(void)
{
lua_State *L;
L = luaL_newstate();
luaopen_base(L);
luaL_openlibs(L);
printf("lua enter\n");
if (luaL_dofile(L, "test.lua"))
{
luaL_error(L, "error running script: %s", lua_tostring(L, -1));
}
printf("lua exit\n");
while(1) pause();
lua_close(L);
return 0;
}
【问题讨论】:
-
您是否确定您的 C 程序使用的是正确版本的 Lua,并且您正在正确编译它(即将它与 Lua 正确链接)?
-
Unix 上的 C 扩展模块期望可执行文件重新导出 Lua API。标准解释器通过将 Lua 库与
-Wl,-E标志静态链接来做到这一点。 -
siffiejoe,我是否使用 -Wl,-E 标志构建了 main.c?像这样:“gcc -o test main.c /usr/local/lib/liblua.a -ldl -lm -Wl,rpath='/usr/local/lib/lua/5.4/socket' -E”?跨度>
-
你好 DarkWiiPlayer,我确定 c 程序使用的是正确的版本,版本是 lua 5.4。
-
作为一个健全性测试,你能让你的 Lua 脚本做
print(_VERSION)吗?