加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 22:16:27 所属栏目:大数据 来源:网络整理
导读:本以为可以像lua一样把代码丢进去直接编译就好了,结果发现luajit有一堆汇编代码,不知道怎么处理,后来一搜索才知道luajit本身提高的批处理也可以编译成静态库,就是在后面加个static,郁闷到了。http://blog.csdn.net/whitehack/article/details/6451293 G

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


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

#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: %sn",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: %sn",lua_tostring(lua,-1));

	lua_close(lua);
	return 0;
}

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读