luajit笔记---编译成静态库以及FFI绑定宿主程序函数
2016-03-31 09:23
531 查看
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/6451293Google来Google,终于看到用FFI绑定宿主程序函数的例子,卧槽,知道真相我的眼泪都流下来!原来FFI本质是绑定导出的符号,所以说只要导出符号就可以用,吐血。[cpp] view plain copy #include <lua.hpp>#include <cassert>// Please note that despite the fact that we build this code as a regular// executable (exe), we still use __declspec(dllexport) to export// symbols. Without doing that FFI wouldn't be able to locate them!extern "C"{__declspec(dllexport) void __cdecl hello_from_lua(const char *msg){printf("A message from LUA: %s\n", msg);}__declspec(dllexport) int Add(int a,int b){return a+b;}}const char *lua_code ="local ffi = require('ffi') \n""ffi.cdef[[ \n""const char * hello_from_lua(const char *); \n" // matches the C prototype"int Add(int,int);""]] \n""ffi.C.hello_from_lua('Hello from LUA!') \n" // do actual C call"sum = ffi.C.Add(10,20) \n""print('sum:'..sum) \n";int main(){lua_State *lua = luaL_newstate();assert(lua);luaL_openlibs(lua);const int status = luaL_dostring(lua, lua_code);if(status)printf("Couldn't execute LUA code: %s\n", lua_tostring(lua, -1));lua_close(lua);return 0;}另外发现,就算是导出了符号,FFI也只能对本程序的导出符号进行绑定,比如我在一个DLL里面导出了符号,虽然宿主程序使用了这个DLL,但是依然没法绑定。后来看了luajit官网,发现lua51.dll里面的函数在FFI是可用的,至于他们怎么做到我就不清楚了,只能说有可能可以做到这一点。这种黑科技果然不是那么热就能掌握的,而且关于luajit,感觉资料实在太少了,说实在其实lua 的资料本身就少了
相关文章推荐
- Lua FFI 实战
- C++混合编程之idlcpp教程Lua篇(4)
- lua报错,attempt to call global 'setmetatable'(a nil value)或者类似错误
- Ubuntu中vim添加lua支持
- Lua环境安装
- C2064: term does not evaluate to a function解决方法
- Seven More Languages in Seven Weeks (读书笔记):Lua
- Lua_第 20 章 IO库
- leetcode 150. Evaluate Reverse Polish Notation
- Self summary: Using Lua in torch (keep updating)
- Self summary: Using Lua in torch (keep updating)
- Self summary: Using Lua in torch (keep updating)
- Self summary: Using Lua in torch (keep updating)
- Self summary: Using Lua in torch (keep updating)
- Self summary: Using Lua in torch (keep updating)
- Self summary: Using Lua in torch (keep updating)
- Lua 常用函数 一
- 首先了解下c++与lua之间的通信:
- 如何将c结构数据传给lua
- Lua中的loadfile、dofile、require详解