PANIC:调用Lua API时未受保护的错误(未定义的符号:lua_gettop)
2021-6-23 7:20:9
收藏:0
阅读:192
评论:1
我的环境是 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) 已终止(core dumped)
有人知道为什么吗?
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进入\n");
if (luaL_dofile(L, "test.lua"))
{
luaL_error(L, "运行脚本出错:%s", lua_tostring(L, -1));
}
printf("lua退出\n");
while(1) pause();
lua_close(L);
return 0;
}
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

tl;dr: 在 GCC 中添加
-Wl,-E参数即可。我使用以下 Dockerfile 复现了你的问题:
FROM gcc:11.1.0 RUN wget https://www.lua.org/ftp/lua-5.4.2.tar.gz \ && git clone https://github.com/diegonehab/luasocket.git RUN tar zxf lua-5.4.2.tar.gz \ && cd lua-5.4.2 \ && make linux \ && make install \ && cd ../luasocket \ && git checkout 5b18e475f38fcf28429b1cc4b17baee3b9793a62 \ && make linux LUAV=5.4 \ && make install LUAV=5.4 COPY test.lua main.c ./当我在生成的 Docker 容器中运行
lua test.lua时,它能够正常工作。但是当我运行gcc -o test main.c /usr/local/lib/liblua.a -ldl -lm -Wl,-rpath='/usr/local/lib/lua/5.4/socket' && ./test时,我得到了你得到的相同的 panic 错误。之所以独立的 Lua 二进制文件可以工作而你的程序不行,是因为前者已经添加了
-E标志 (-E 标志):[
ld的说明文档] (https://sourceware.org/binutils/docs/ld/Options.html#index-_002dE) 讲到:Lua 使用
dlopen加载 C 模块,在编译时需要调用链接到您的可执行文件中的 Lua 函数,所以很有道理需要使用这个选项。而实际上,当我在 GCC 命令行中添加-Wl,-E参数时,程序可以正常工作:root@077bbb831441:/# gcc -o test main.c /usr/local/lib/liblua.a -ldl -lm -Wl,-rpath='/usr/local/lib/lua/5.4/socket' -Wl,-E && ./test lua enter LuaSocket 3.0-rc1 lua exit