lua动态链接库(luaopen_*函数的使用)

2023-10-27

lua中使用c动态库,像luacjson(支持unicode),luasocket,都是以动态链接库的形式在lua中使用的,至于怎么写这些动态链接库很少有教程说到,下面我就说说如何把c文件编译成动态库。

首先,假设需要在lua中调用一个在c中实现的求和函数,函数名add(a,b)。

我给这个测试库取名为dylib,它包含一个函数add。lua中这样使用:

    local dylib = require "dylib.test"
    local c = dylib.add(1,2)
    print(c)
上面的dylib.test就是我编译生成的dylib/test.so文件。这个文件该怎么生成?如下:

    int
    luaopen_dylib_test(lua_State* L) {
        luaL_Reg l[] = {
           { "add", *dylib_add* },
           { NULL, NULL },
        };
        luaL_checkversion(L);
        luaL_newlib(L,l);

        return 1;
    }
这个函数名有个命名规则,前缀为luaopen,后面就是lua中require的字符串(将'.'转换成'')。当执行到require "dylib.test"时,lua解析器会去dylib/test.so文件中寻找并执行函数名为luaopen_dylib_test的函数。找不到则报错:

    lua: error loading module 'dylib.test' from file './dylib/test.so':
        ./dylib/test.so: undefined symbol: luaopen_dylib_test
    stack traceback:
        [C]: in ?
        [C]: in function 'require'
        test.lua:1: in main chunk
        [C]: in ?
注意到dylib_add就是就是要实现的dylib.add函数。现在实现它:

    int
    dylib_add(lua_State* L) {
        int a = lua_tonumber(L,1);
        int b = lua_tonumber(L,2);
        int c = a+b;
        lua_pop(L,2);
        lua_pushnumber(L,c);
        return 1;
    }
这函数就是把两参数加起来,然后返回和。最后编译生成so文件:

    gcc -g -Wall --shared -fPIC -o dylib/test.so dylib_test.c
注意要给它建一个文件夹dylib。因为require的时候会把"dylib.test"转成"dylib/test"默认去该路径下寻找so或者lua文件。当然,你修改了搜索路径那是另外一回事了。

基本的就是这样子了。正在看云风的hive游戏服务器框架(skynet的精简版,不是apache hive)。

转载地址:http://www.cppblog.com/sleepwom/archive/2014/11/04/208778.aspx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

lua动态链接库(luaopen_*函数的使用) 的相关文章

  • 为什么 LuaJIT 和 Lua 中的数字舍入格式不同?

    Using string format 据说遵循 Csprintf 在 LuaJIT 轮次中格式化数字与我尝试过的所有其他 Lua 解释器不同 lua v Lua 5 4 1 Copyright C 1994 2020 Lua org PU
  • corona sdk中拖动物理对象

    我尝试在场景中拖动重力 0 0 的动态主体 我有一个主体类型为动态的正方形 以及一个主体类型为静态的图像 但是当将方形拖动到图像上时 它会产生一点力 但是可以超出图像并传递到另一边 如图所示 这是我拖动正方形的代码 local functi
  • lua http套接字超时

    LuaSocket HTTP 模块文档说可以在 HTTP 连接上设置超时 可以设置以下常量来控制 HTTP 模块的默认行为 PORT 用于连接的默认端口 PROXY 用于连接的默认代理 TIMEOUT 设置所有I O操作的超时时间 USER
  • Lua-迭代嵌套表

    我已经学习 Lua 几个星期了 这一次又一次成为我的症结所在 我尝试阅读有关该主题的帖子和书籍 我使用 Lua 查询软件监控系统 Nimsoft 我的数据以表格形式返回给我 我不会发布整个输出 但这里有一个我认为可以描述结构的片段 表参考是
  • Kong - 验证上游 ssl(ssl_proxy 打开)

    我已经成功为 API 安装了 kong 网关 该 API 通过上游负载平衡到多个目标 应用程序服务器 现在 我有一个我的应用程序服务器的自签名证书 kong 和目标之间的 ssl 握手应该失败 我推断 kong 不验证上游证书 经过一些研究
  • 如何在 Lua 中实现 OO?

    Lua 没有内置对 OO 的支持 但它允许您自己构建它 您能否分享一些实现面向对象的方法 请为每个答案写一个例子 如果您有更多示例 请发布另一个答案 我喜欢将 OOP 视为容器 对象 内的数据封装以及可以使用该数据完成的操作子集 还有很多内
  • Lua 从 5.1 更新 - LUA_GLOBALSINDEX 问题

    我最近将旧的 Lua 5 1 项目更新到了该库的最新版本 但遇到了问题LUA GLOBALSINDEX 它变得不确定 我只用过它lua getfield函数 像这样 void luastartgame void if startgamefu
  • 在Lua中获取前一天的日期

    谁能告诉我如何使用 Lua 获取 YYYY MM DD 格式的前一天日期 即 一个片段 它将返回运行当天的前一天的日期 Try print os date Y m d os time 24 60 60 严格来说 这只能保证在 POSIX 系
  • Lua中按字符分割字符串

    我有像这样的字符串 ABC DEF 我需要将它们分开 字符并将两个部分分别分配给一个变量 在 Ruby 中 我会这样做 a b ABC DEF split 显然Lua没有这么简单的方法 经过一番挖掘后 我找不到一种简短的方法来实现我所追求的
  • Lua 将字符串转换为数字 - 取决于语言环境

    刚刚注意到字符串 and tonumber 在 Lua 中是依赖于语言环境的 知道如何在不使用的情况下将字符串转换为数字tonumber 谢谢 例如将字符串 58 5 转换为 58 5 另外 当我尝试将带点的数字传递给函数时 该函数会转换
  • LuaJ 导入 Lua 方法

    我正在使用 LuaJ 并且我有一个 lua文件充满了一堆函数 如何通过 LuaJ 导入这些函数以在 Java 中使用 一种选择是将文件编译为 Java 代码并导入它 另一种方法是使用可嵌入解释器直接从 Java 代码中调用 Lua 文件 E
  • 关闭 Löve2D 中的抗锯齿功能

    我在用着L ve2D http love2d org用于编写一个小游戏 L ve2D 是 Lua 的开源游戏引擎 我遇到的问题是 当您在非整数位置绘制精灵时 某些抗锯齿过滤器会自动应用于精灵 love graphics draw sprit
  • 在 Awesome-wm 中为特定应用程序设置窗口布局

    如何配置很棒 以便它可以启动两个窗口对齐的新应用程序 如下所示 xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx 其中 x 是 pidgin 中的对话窗口 是好友列表窗口 一般来说 我想指定右窗口的宽度
  • gsub 的转义字符串

    我读了一个文件 local logfile io open log txt r data logfile read a print data output n w r 1 2 n t x re S 是的 日志文件看起来很糟糕 因为它充满了各
  • 如何在 Lua - Lightroom 插件中使用 HMAC

    首先我要提的是我对 Lua 真的很陌生 如果你认为我的问题太愚蠢 请耐心等待 这是我的要求 我需要使用 HMAC sha256 进行 Lightroom 插件开发 因为我使用它是为了安全 我试图使用这个但没有运气https code goo
  • 云到设备 Azure IoT REST API

    我探索了如何使用 Azure REST API 将数据从设备发送到云 它运行无缝 没有任何问题 我没有找到有关使用 Azure IoT Hub REST API 向 Arduino 板发送云到设备消息的好文章 有人可以就此提供建议吗 您还可
  • Tarantool 中的冲突解决(如何在发生冲突时修复主-主模式下的复制)

    在多master场景下使用Tarantool如何实现冲突解决 我正在开发一项应该具有高可用性的服务 因此决定使用 nginx 作为 tarantool 两个节点 禁用只读选项 的负载均衡器 带有备份指令 它会重试对其他节点的失败请求 但如果
  • 从命令行运行 vlc 扩展

    我有一个用 Lua 编写的 vlc 扩展 我知道如何从 GUI 运行它 查看 gt 我的扩展 我想从命令行运行它 这样我就不需要每次都启动X 它还没有实施 查看门票 3883 https trac videolan org vlc tick
  • Lua(命令行)执行后保持打开状态

    我已经广泛寻找这个但我似乎找不到它 有什么方法可以执行Lua通过双击脚本 在中执行它 Lua Command Line 并在执行后保持打开状态 例如 print Hello World 该代码可以编译并运行 但是如果我双击hello lua
  • 如何重载Lua字符串下标运算符?

    This debug getmetatable index function s i return s sub i i end 和这个 debug getmetatable index proc lua read 不起作用 Try debu

随机推荐

  • 通过css实现对勾(√)和叉号(×)

    通过css实现对勾 和叉号 第一种方式 HTML span class status correct span span class status incorrect span CSS correct display inline bloc
  • 字符编码和字符集

    编码和解码 按照某种规则 将字符存储到计算机中 称为 编码 那么 将计算机中的二进制数据按照某种规则解析显示出来 称为 解码 字符编码 就是一套自然语言的字符和二进制数据之间的对应规则 把这种对应规则 写成一张表 就是 编码表 也叫字符集
  • kv遍历

    var builder var builderKey var builderValue for var i 0 i lt message length i var c message charAt i var nextStr message
  • 互联网高可用架构探讨

    高可用指标与问题 高可用 英文单词High Availability 缩写HA 它是分布式系统架构设计中一个重要的度量 业界通常用多个9来衡量系统的可用性 如下表 既然有可用率 有一定会存在不可用的情况 系统宕机一般分为有计划的和无计划的
  • 数码管:3位6脚的数码管分析和编码

    基本简介 一个1位数码管共有8段 ABCDEFG 小数点 如下图 按照我们常规的设计方案一个 IO 口控制一个段 一个1位数码管那么就需要8个IO 当然我们也可以使用扩展 IO 芯片 例如 74HC164 74HC595 那么这种方案就占用
  • Linux 中卷组不真实存在情况下,强制删除卷组及其PV信息

    由于手误删除lVm顺序不对 导致真实pV 已经不存在 但是卷组信息及其PV信息还存在系统中 pvdisplay和vgdisplay都能看到信息 这时候可以到 dev 目录下手动rm 掉 pv 再查看卷组 就真的不存在了
  • Android取消点击效果,Android中如何取消listview的点击效果

    Android中如何取消listview的点击效果 在xml文件里面有listselecter的属性引用 android layout width match parent android layout height wrap conten
  • 【3D游戏基础】蒙皮骨骼动画与骨架

    效果 目标 画出蒙皮动画的骨架 视频 https www bilibili com video BV1pM411m7Yw PPT https zfxdvouj61 feishu cn file boxcnwgESO6zdQetO7oNhKb
  • vant Cascader 级联选择 异步加载

  • .suo介绍

    suo suo是一种文件的格式 suo 解决方案用户选项 记录所有将与解决方案建立关联的选项 以便在每次打开时 它都包含用户所做的自定义设置 比如VS布局以及项目最后编译的而又没有关掉的文件用于下次打开时用 其中 VS布局包括 监视器123
  • Linux性能测试工具

    在Linux Benchmark Suite Homepage网站上列举了诸多Linux性能测试工具 包括CPU RAM ROM Cache net等性能测试 lmbench 测试工具 这个工具集中包含以下几种测试工具 我们主要使用到bw
  • 织梦DedeCMS移动站的搜索功能实现方法

    很早之前在做博客的时候 就考虑到把搜索功能在移动端实现 初略的做完后 发现移动端总是会跳转到pc模版 很不友好 前几天 刚好有时间就把这个功能给实现了 其实很简单 接下来放出教程 一 复制 plus search php文件 打开PC端的文
  • ClickHouse之单表多表查询优化

    文章目录 1 本文简介 2 单表查询优化 1 Prewhere 替代 where 2 数据采样 3 指定select字段查询与分区裁剪 4 orderby结合 where limit 5 避免构建虚拟列 6 uniqCombined 替代
  • Maven Helper mvn项目冲突如何解决

    一般用这款插件来查看maven的依赖树 一 安装 File gt setting gt Plugins gt 在搜索框中填写Maven Helper然后搜索 单击Install按钮进行安装 装完重启IDE 二 使用 当Maven Helpe
  • 使用BP神经网络和Elman Net预测航班价格(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 BP神经网络模型是目前应用最为广泛神经网络
  • Unity 自定义鼠标样式

    using System Collections using System Collections Generic using Framework using UnityEngine
  • BCryptPasswordEncoder的matches方法返回false

    用BCryptPasswordEncoder 做加密 在判断时要用该对象的matches方法 第一个参数为明文 第二个参数才是密文 public static void main String args BCryptPasswordEnco
  • 欧启标O老师STM32课程笔记(二)——蜂鸣器发声

    1 硬件原理 下图为蜂鸣器的电路图 分析这个电路 想让蜂鸣器发声 则需要有电流流过蜂鸣器 当BEEP 即PB8 为高电平时 三极管导通 电流流过蜂鸣器 蜂鸣器发声 反之 当BEEP 即PB8 为低电平时 三极管截止 蜂鸣器不发声 所以控制蜂
  • Rxjava参考文档

    https mcxiaoke gitbooks io rxdocs content operators Timer html
  • lua动态链接库(luaopen_*函数的使用)

    lua中使用c动态库 像luacjson 支持unicode luasocket 都是以动态链接库的形式在lua中使用的 至于怎么写这些动态链接库很少有教程说到 下面我就说说如何把c文件编译成动态库 首先 假设需要在lua中调用一个在c中实