凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 1226274
  • 博文数量: 389
  • 博客积分: 2874
  • 博客等级: 少校
  • 技术积分: 3577
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-24 10:34
文章分类

(389)

  • (1)
  • (1)
  • (1)
  • (2)
  • (2)
  • (1)
  • (2)
  • (0)
  • (1)
  • (6)
  • (1)
  • (1)
  • (14)
  • (2)
  • (4)
  • (1)
  • (1)
  • (6)
  • (12)
  • (42)
  • (2)
  • (1)
  • (2)
  • (18)
  • (27)
  • (53)
  • (2)
  • (0)
  • (19)
  • (36)
  • (0)
  • (40)
  • (20)
  • (11)
  • (10)
  • (36)
  • (11)
文章存档

(2)

(39)

(27)

(3)

(55)

(92)

(54)

(53)

(64)

最近访客
相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: erlang

2018-07-07 15:29:47

用5.1的方法各种坑,看到一篇文章,参考之解决各种问题

lua5.3编写c module-凯发app官方网站


系统环境: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开源软件下载和安装方法,可参考另一篇博文:


1lua脚本调用c程序

1.1c程序实现(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.2lua脚本实现(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.1c程序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.2c程序math.cluaopen_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.3lua脚本中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

阅读(1359) | 评论(0) | 转发(0) |
0

上一篇:

下一篇:

给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图