20191009(20) PANIC: unprotected error in call to Lua API && LINUX && QT C编译调 LUA (LUA 2 结束)

水深无声 2023-06-05 15:55 63阅读 0赞

前言

1 QT 编译器
2 LINUX
3 Lua 5.3.5


安装

官网下载最新版本
使用 yum 指令的 linux 版本 可以参考这篇


添加环境(针对 QT)

  1. Pro 环境中添加库

LIBS += /home/xx/liblua.a -ldl #我这里直接加到这里,makefile 请参考直接编译链接
INCLUDEPATH += /home/xx/lua-5.3.5/src

说明:
1 LIBS 指明 lua 库的位置,我放在 main.c 同一个文件夹
2 -ldl 这是 Linux 环境需要编译的时候添加
直接编译请参考 makefile
https://github.com/ejoy/ejoy2d/blob/master/Makefile\#L107
在这里插入图片描述
直接编译 gcc -o a main.c -llua -lm -ldl

应对这个错误
PANIC: unprotected error in call to Lua API (attempt to call a nil value)

3 INCLUDEPATH 不一定需要如果能够检索到 lua.h 就不用加


例程

  1. filePath: test.lua
  2. #!/usr/local/bin/lua
  3. function show_name()
  4. printf("hello world!")
  5. end
  6. function count(a, b)
  7. return a+b
  8. end
  9. filePath: main.c
  10. #include <stdio.h>
  11. #include <QtDebug>
  12. extern "C" {
  13. #include <lua.h>
  14. #include <lualib.h>
  15. #include <lauxlib.h>
  16. }
  17. int main() {
  18. lua_State* L = luaL_newState();
  19. luaL_openlibs(L);
  20. luaL_loadfile(L, "qrc:/test.lua"); //文件路径一开始写绝对路径就好 /home/xx/test.lua
  21. luaL_pcall(L, 0, 0, 0);// 这个很有趣,在实际测试中提前先使用这个函数,后面 lua 才能功能正常,可以自行尝试(暂只在 QT 测试并遇到该问题)
  22. lua_getglobal(L, "show_name");
  23. luaL_pcall(L, 0, 0, 0); //无返回,无输入得用这个
  24. lua_getglobal(L, "count");
  25. lua_pushnumber(L, 1);
  26. lua_pushnumber(L, 2);
  27. lua_call(L, 2, 1); //2 个参数, 1 个返回
  28. qDebug() << lua_tonumber(L, -1);// 自行用其它打印也行
  29. lua_pop(L, -1);//具体看文档
  30. lua_close(L);
  31. return 0;
  32. }
  33. 输出 output
  34. hello world!
  35. 3

发表评论

表情:
评论列表 (有 0 条评论,63人围观)

还没有评论,来说两句吧...

相关阅读

    相关 lua入门之一:c/c++ 调用lua

    lua和c / c++的数据交互通过栈进行, 操作数据时,首先将数据拷贝到"栈"上,然后获取数据,栈中的每个数据通过索引值进行定位,索引值为正时表示相对于栈底的偏移索引,索引值

    相关 Lua学习笔记--Lua调用C初探

    上次学习了怎么用C调用Lua的函数,并返回一个结果,这次看看怎么反过来,用Lua调用C的函数。 一.简介 C调用Lua函数比较简单,只需要操作相关的栈就可以了,但是Lu