首页 > 编程语言 >Lua调用C程序以及so程序

Lua调用C程序以及so程序

时间:2024-05-12 23:52:50浏览次数:25  
标签:return mylib lua 程序 Lua so include luaL

这篇博客介绍了lua代码调用C程序代码的方式。
https://chsasank.com/lua-c-wrapping.html

总结:

在C代码中需要引入lua状态机等库函数,并填写接口到函数的映射关系。

编译该C代码文件,生成so包后,lua就能引入相关包。

对于sinTest.c代码文件(内容如下所示),通过如下命令生成so包:

gcc sinTest.c -shared -o mylib.so -fPIC -I/usr/include/lua5.3 -llua5.3

然后在lua中就能调用相关的so动态库了。

当然,这样的实现不够优雅,每个函数都要手动解析Lua传递过来的参数;而对于C++中的类则不够方便封装了。

而解决上述两个问题的一个方法,是通过Swig


#ifdef __cplusplus
  #include "lua.hpp"
#else
  #include "lua.h"
  #include "lualib.h"
  #include "lauxlib.h"
#endif
#include <math.h>

//so that name mangling doesn't mess up function names
#ifdef __cplusplus
extern "C"{
#endif

static int c_swap (lua_State *L) {
    //check and fetch the arguments
    double arg1 = luaL_checknumber (L, 1);
    double arg2 = luaL_checknumber (L, 2);

    //push the results
    lua_pushnumber(L, arg2);
    lua_pushnumber(L, arg1);

    //return number of results
    return 2;
}

static int my_sin (lua_State *L) {
    double arg = luaL_checknumber (L, 1);
    lua_pushnumber(L, sin(arg));
    return 1;
}

//library to be registered
static const struct luaL_Reg mylib [] = {
      {"c_swap", c_swap},
      {"mysin", my_sin}, /* names can be different */
      {NULL, NULL}  /* sentinel */
    };

//name of this function is not flexible
int luaopen_mylib (lua_State *L){
    luaL_newlib(L, mylib);
    return 1;
}

#ifdef __cplusplus
}
#endif

标签:return,mylib,lua,程序,Lua,so,include,luaL
From: https://www.cnblogs.com/ckxkexing/p/18188435

相关文章

  • 一名合格的程序猿修炼手册
    一名合格的程序猿修炼手册......
  • Useful resources
    AboutwritingMathematicalReasoningWritingandProof,formore,clickhere.Sciencewritingfornon-nativeEnglishspeakersMathematicalTypesettingResourcesMathematicalTypesettingResourcesonlinemarkdowneditorLecturenotesAlgebraHatcher......
  • npm install 报错 ---》npm ERR! request to https://registry.npmjs.org/react faile
    1、npminstall报错E:\wsg\AWC_TEST\stage>npminstallreactreact-domnpmERR!codeCERT_NOT_YET_VALIDnpmERR!errnoCERT_NOT_YET_VALIDnpmERR!requesttohttps://registry.npmjs.org/reactfailed,reason:certificateisnotyetvalidnpmERR!Acomplete......
  • WinForm使用IOC控制程序
    新建WinForm程序1、添加Nuget包Microsoft.Extensions.DependencyInjection2、改变启动项internalstaticclassProgram{///<summary>///应用程序的主入口点。///</summary>[STAThread]staticvoidMain(){//创建服务容......
  • lesson4
    单词manual体力的adjmental脑力的spiritual精神的materail物质的emancipate解放emamcipateslavesmuchbuddycolortietieatiesighasigh(叹了口气)wishawish(许了一个愿)dieagloriousdeath(死的光荣)sacrifice...for...为了...牺牲giveup/aband......
  • 基于webapi的websocket聊天室(三)
    上一篇处理了超长消息的问题。我们的应用到目前为止还是单聊天室,这一篇就要处理的多聊天室的问题。思路第一个问题,怎么访问不同聊天室这个可以采用路由参数来解决。我把路由设计成这样/chat/{room}。访问不同路径就代表进入不同聊天室。第二个问题,怎么创建不同的聊天室原......
  • c语言程序实验————实验报告八
    c语言程序实验————实验报告八实验项目名称:实验报告8字符串处理函数实验项目类型:验证性实验日期:2024年5月9日一、实验目的1.熟练掌握数组的定义格式和数组元素的表示方法;2.熟悉数组的初始化方法和赋值方法;3.掌握字符数组存放字符串的方法和字符串函数的使用;4.......
  • Lua热更学习--使用toLua中的协程
    [6]C#访问调table类中的成员变量和函数访问table中的变量和函数lua中可以使用table作为class,因此对table中的函数访问调用是必要的根据前面对table访问和function的获取调用,这里尝试获取调用。依然是如此,此种调用方式获取到的table中的函数是引用拷贝。Main.lua脚本新增内容......
  • 基于webapi的websocket聊天室(二)
    上一篇-基于webapi的websocket聊天室(一)消息超传缓冲区的问题在上一篇中我们定义了一个聊天室WebSocketChatRoom。但是每个游客只分配了400个字节的发言缓冲区,大概100字。如果需要发送更多内容呢?难道直接增大缓冲区?这是一个办法。但还有其他办法。多次接受消息可以多次调......
  • 如何同时或者按顺序间隔启动多个程序
    首先,需要用到的这个工具:度娘网盘提取码:qwu2蓝奏云提取码:2r1z1、打开工具,切换到定时器模块,快捷键:Ctrl+3 2、新建一个定时器,我这里演示同时打开多个程序(比如同时启动多个QQ,或者多个微信等),那就把单次数量提高,如果想每次执行这个定时器里面的3个事件,那单次数量就是写3,我......