luajit笔记---编译成静态库以及FFI绑定宿主程序函数

2023-11-16

luajit笔记---编译成静态库以及FFI绑定宿主程序函数

发表于2016/3/31 9:23:19  219人阅读

分类: Lua

local ffi = require("ffi")
ffi.cdef[[
   typedef struct { 
     uint8_t id;
     char * name; 
   } stuInfo;
]]--新建一个结构体
local n = 1
local stu = ffi.new("stuInfo[?]", n)--新建变长的结构体变量
for i=0, n-1 do
   stu[i].id = 1;
   local name = "zhao";
   local ptr=ffi.cast("char *", name);--将lua中字符串转换为c的`char *`
   stu[i].name = ptr;
end

print(stu[0].id);
local myname = ffi.string(stu[0].name);--将c中`char *`类型转换为lua的字符串
print(myname);


http://blog.csdn.net/fg5823820/article/details/8888207

本以为可以像lua一样把代码丢进去直接编译就好了,结果发现luajit有一堆汇编代码,不知道怎么处理,后来一搜索才知道luajit本身提高的批处理也可以编译成静态库,就是在后面加个static,郁闷到了。http://blog.csdn.net/whitehack/article/details/6451293

Google来Google,终于看到用FFI绑定宿主程序函数的例子,卧槽,知道真相我的眼泪都流下来!原来FFI本质是绑定导出的符号,所以说只要导出符号就可以用,吐血。

[cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. #include <lua.hpp>  
  2.   
  3. #include <cassert>  
  4.   
  5. // Please note that despite the fact that we build this code as a regular  
  6. // executable (exe), we still use __declspec(dllexport) to export  
  7. // symbols. Without doing that FFI wouldn't be able to locate them!  
  8.   
  9. extern "C"   
  10. {  
  11.     __declspec(dllexportvoid __cdecl hello_from_lua(const char *msg)  
  12.     {  
  13.         printf("A message from LUA: %s\n", msg);  
  14.     }  
  15.     __declspec(dllexportint  Add(int a,int b)  
  16.     {  
  17.         return a+b;  
  18.     }  
  19. }  
  20.   
  21. const char *lua_code =  
  22. "local ffi = require('ffi')                   \n"  
  23. "ffi.cdef[[                                   \n"  
  24. "const char * hello_from_lua(const char *);   \n" // matches the C prototype  
  25. "int Add(int,int);"  
  26. "]]                                           \n"  
  27. "ffi.C.hello_from_lua('Hello from LUA!')      \n" // do actual C call  
  28. "sum = ffi.C.Add(10,20)      \n"  
  29. "print('sum:'..sum)      \n"  
  30. ;  
  31.   
  32. int main()  
  33. {  
  34.     lua_State *lua = luaL_newstate();  
  35.     assert(lua);  
  36.     luaL_openlibs(lua);  
  37.   
  38.     const int status = luaL_dostring(lua, lua_code);  
  39.     if(status)  
  40.         printf("Couldn't execute LUA code: %s\n", lua_tostring(lua, -1));  
  41.   
  42.     lua_close(lua);  
  43.     return 0;  
  44. }  

另外发现,就算是导出了符号,FFI也只能对本程序的导出符号进行绑定,比如我在一个DLL里面导出了符号,虽然宿主程序使用了这个DLL,但是依然没法绑定。

后来看了luajit官网,发现lua51.dll里面的函数在FFI是可用的,至于他们怎么做到我就不清楚了,只能说有可能可以做到这一点。这种黑科技果然不是那么热就能掌握的,而且关于luajit,感觉资料实在太少了,说实在其实lua 的资料本身就少了

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

luajit笔记---编译成静态库以及FFI绑定宿主程序函数 的相关文章

随机推荐

  • idea中如何创建xml文件

    本人做java开发程序员已经三年多了 从进入企业至今一直使用idea 对此开发工具还算了解 本人使用的版本 我是一个比较守旧的人 在2020年的今天还是依然使用2017年的版本 还请光大网友见谅哈 今天想说的就是如何在idea中创建 xml
  • docker高级篇(mysql主从,redis主从搭建,Dockerfile解析及docker-compose编排)

    本篇主要是mysql主从 redis主从搭建 Dockerfile解析及docker compose编排 轻量化可视化工具Portainer 重量级工具CAdvisor InfluxDB Granfana的使用 docker的安装 配置 卸
  • 如何把swf的动画嵌入到ppt中_flash(.swf)嵌入ppt中

    利用ppt的控件工具箱中的shockwave flash object控件 添加一个swf文件到ppt 然后右击这个swf文件编辑其属性时 把EmbedMovie一项的值改为True 就表示将其嵌入ppt 你就可以删除swf源文件了 使用
  • ThinkPad E40 XP 安装SATA/AHCI驱动

    ThinkPad E40 XP 安装SATA AHCI驱动 2010 11 06 16 42 我的机子是ThinkPad E40 0578A59 安装XP之后准备打开SATA硬盘的AHCI模式并安装其驱动 但是总是安装失败 只要在BIOS里
  • 吃透这份“Java进阶核心手册”再战字节,直接把面试官按在地上摩擦

    前言 本人计算机本科 已经有两年Java开发经验 由于原来公司已经不能满足我的需求 辞去原来的工作准备跳槽大厂 在辞职之前也认为有做过一段时间的准备 2021年8月初 我满怀信心去字节跳动面试Java研发岗位 结果当场被字节面试官吊打 莫不
  • echarts后台获取数据,前台实现饼图显示并自定义图形的数据表展示格式

    1 实现效果图 切换前效果 切换后效果 2 关键的js代码 var myChart echarts init document getElementById aaa 为echarts对象加载数据 var opts post getUnitA
  • JavaScript DOM(二)查

    书接上回 节点 DOM中有许多不同类型的节点 接下来我们先看看其中的三种 元素节点 文本节点和属性节点 元素节点 指该html里面标签的名字就是元素的名字 例如 我们使用的 p p ul 和 div 之类的元素 p标签的名字是 p 无序列表
  • 安装Node(脚手架)

    目录 一 安装node 脚手架 1 1 配置vue config js 1 2 vue cli3x的目录介绍 1 3 package json 最后 一 安装node 脚手架 从官网直接下载安装即可 自带npm包管理工具 https nod
  • [1132]Flink与Kafka版本对应关系

    以下为Flink和Kafka的版本对照表 Flink版本 Kafka版本 1 12 X 2 4 1 1 11 X 2 4 1 1 10 X 2 2 1 1 9 X 2 2 0 1 8 X 2 0 1 1 7 X 2 0 1 0 10 x 0
  • 怎么把服务器安装系统还原,云服务器磁盘怎么安装系统还原

    云服务器磁盘怎么安装系统还原 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 如果Windows操作系统弹性云服务器未安装
  • 程序源码分享-STM32的PID实验(含DAC和ADC)

    一 PID 算法原理 在工业应用中 PID 及其衍生算法是应用最广泛的算法之一 是当之无愧的万能算法 如果能够熟练掌握 PID 算法的设计与实现过程 对于一般的研发人员来讲 应该是足够应对一般研发问题了 在我所接触的控制算法当中 PID 控
  • python链接oracle数据库以及数据库的增删改查

    初次使用python链接oracle 所以想记录下我遇到的问题 便于向我这样初次尝试的朋友能够快速的配置好环境进入开发环节 1 首先 python链接oracle数据库需要配置好环境 我的相关环境如下 1 python Python 3 6
  • 推荐算法3—基于用户的协同过滤算法

    基于邻域的算法是推荐系统中最基本的算法 该算法分为两大类 一类是基于用户的协同过滤算法 另一类是基于物品的协同过滤算法 1 基础算法 在一个在线个性化推荐系统中 当一个用户A需要个性化推荐时 可以先找到和他有相似兴趣的其他用户 然后把那些用
  • 命令执行漏洞原理和测试

    PHP system exec shell exec passthru popen proc popen等称为高危漏洞 原理 只要程序可以调用系统命令的情况下都可以发生命令执行漏洞 条件 用户能够控制函数输入 存在可以执行代码的危险函数 命
  • Linux基础学习(下)——VMWare+CentOS7

    目录 Linux账号管理 用户组管理 磁盘管理 进程管理 Linux环境安装 三种软件安装方式 扩展 VMware使用 Linux账号管理 Linux系统是一个多用户多任务的分时操作系统 任何一个要使用系统资源的用户 都必须首先向系统管理员
  • linux下错误使用pthread_mutex_lock导致程序奔溃问题分析

    在进行程序开发过程中 错误使用了pthread mutex lock导致程序概率性的奔溃 奔溃时报如下错误 问题分析 本文分析在Linux应用程序中错误使用pthread mutex锁时会概率性触发SIG ABRT信号而导致程序崩溃 库打印
  • QFile类,以及利用QFile进行最基本的text文件打开与保存

    在qt中 操作现存文件的流程 一 QFileDialog 利用这个类可以通过对话框获得文件的目录 QFileDialog getOpenFileName 二 QFile 利用这个类 我们可以打开文件 三 QTextStream 这是一个tx
  • 【C++编程基础】AOJ (C++ Programming II)—2-A-stack

    2 A stack 题目 stack Stack is a container of elements that are inserted and deleted according to LIFO Last In First Out Fo
  • 四段论提问让ChatGPT更懂你心!

    用户故事是描述客户需求的方法 通常记为四段论的格式 角色 功能 目的 验收标准 如 作为一个家庭主妇 我需要一个30平方米的餐厅 用以招待10位客人聚餐 我希望这个餐厅 1 四四方方 2 距离厨房不超过10步 3 光线充足 白天可以不开灯打
  • luajit笔记---编译成静态库以及FFI绑定宿主程序函数

    luajit笔记 编译成静态库以及FFI绑定宿主程序函数 发表于2016 3 31 9 23 19 219人阅读 分类 Lua local ffi require ffi ffi cdef typedef struct uint8 t id