(389)
(2)
(39)
(27)
(3)
(55)
(92)
(54)
(53)
(64)
分类: erlang
2018-07-07 15:29:47
系统环境:centos 6.5
linux hlz 2.6.32-431.el6.i686 #1 smp fri nov 22 00:26:36 utc 2013 i686 i686 i386gnu/linux
lua开源软件版本:lua-5.3.4.tar.gz
特别说明,由于lua-5.1.x版本与后续版本的接口函数的差异较大,为保证本文提供小程序可直接在你本地调试通过,请安装5.2以及后续版本的lua开源软件。
lua开源软件下载和安装方法,可参考另一篇博文:
1、lua脚本调用c程序
1.1、c程序实现(math.c):
#include
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
static int c_add(lua_state *l)
{
int a, b;
a = lua_tonumber(l, 1);
b = lua_tonumber(l, 2);
lua_pushnumber(l, a b);
return 1;
}
static int c_sub(lua_state *l)
{
int a, b;
a = lua_tonumber(l, 1);
b = lua_tonumber(l, 2);
lua_pushnumber(l, a - b);
return 1;
}
static const struct lual_reg reg_libs[] =
{
{"lua_add", c_add},
{"lua_sub", c_sub},
{null, null}
};
int luaopen_clibs(lua_state *l)
{
lua_newtable(l);
lual_setfuncs(l, reg_libs, 0);
//lual_register(l, "clibs", reg_libs);
return 1;
}
1.2、lua脚本实现(math.lua):
local clibs = require("clibs")
c =clibs.lua_add(10, 20) --调用c中注册的函数lua_add
d =clibs.lua_sub(99, 33)
print("c= ", c)
print("d= ", d)
1.3、把c文件编译成动态库文件:
[root@hlzlua_c]# gcc -fpic -shared -o clibs.so math.c
[root@hlzlua_c]# ls
math.lua clibs.so math.c
1.4、执行lua程序:
[root@hlzlua_c]# lua math.lua
c= 30.0
d= 66.0
2、常见错误及解决方法:
2.1、c程序math.c的 luaopen_clibs 函数必须满足命名规则,即固定前缀 luaopen_ 动态库名(不包含后缀.so)
譬如本文的c源文件中,原来注册函数命名为int lua_clibs_reg(lua_state *l),在执行lua程序报了符号未定义错误:
[root@hlzlua_c]# gcc -fpic -shared -o clibs.so math.c
[root@hlzlua_c]# lua math.lua
lua:error loading module 'clibs' from file './clibs.so':
./clibs.so: undefined symbol:luaopen_clibs
stack traceback:
[c]: in ?
[c]: in function 'require'
math.lua:3: in main chunk
[c]: in ?
2.2、c程序math.c的luaopen_clibs函数中,用lual_setfuncs注册而非lual_register
用lual_register编译&链接均不报错,但是执行math.lua脚本时,会报如下错误(可能是与lua版本有关,新版本5.3.4的lua库中没有lual_register接口了):
[root@hlzlua_c]# gcc -fpic -shared -o clibs.so math.c
[root@hlzlua_c]# lua math.lua
lua:error loading module 'clibs' from file './clibs.so':
./clibs.so: undefined symbol:lual_register
stacktraceback:
[c]: in ?
[c]: in function 'require'
math.lua:3: in main chunk
[c]: in ?
2.3、lua脚本中require加载so文件返回的对象应保存下来,否则执行lua脚本会报错
用local clibs = require("clibs"),而非require("clibs"):
[root@hlzlua_c]# lua math.lua
lua:error loading module 'clibs' from file './clibs.so':
./clibs.so: undefined symbol:luaopen_clibs
stacktraceback:
[c]: in ?
[c]: in function 'require'
math.lua:2: in main chunk
[c]: in ?
??
摘自:https://blog.csdn.net/hanlizhong85/article/details/74058235
上一篇:
下一篇: