【Lua】Lua调用C动态库

lua 好归好,但有很多对效率要求较高的服务,还得让C来完成。本篇学习下Lua如何调用C。


最重要的部分:

定义一个 luaopen_* 函数,并调用 luaL_openlib 函数

int luaopen_mylib(lua_State *L)
{
        luaL_Reg l[] = {
            {"test1",test1},	// key-val,相当于{"(lua调用时使用的函数名)",C定义函数名(函数指针)}
            {"test2",test2},
            {NULL,NULL}		// 必不可少
        };
        luaL_newlib(L,l);
        return 1;
}

这个函数相当于作为此动态库的main函数。需要注意:

1、luaopen_是此函数的前缀,不可修改。后面的内容是我们在lua中使用 require 引用此库时的字符串名称(假如名称中带有下划线,在使用require需要将下划线替换为点,例如:“mylib_test”->“mylib.test”)。
2、在Lua5.0中调用的是luaL_openlib,但是在Lua5.3中,则是使用luaL_newlib


下面是一个简单的例子:

#include <lua.h>					//Lua基础函数库,lua_前缀
#include <lauxlib.h>					//辅助库,luaL_前缀,利用lua.h实现的更高层的抽象
#include <stdio.h>


/**
 * 定义在lua中可调用的函数,要遵循规范:返回值必须为int,需传入lua_State
 */
static int test(lua_State *L)
{
	size_t len = 0;
	int num = luaL_checkinteger(L, 1);
	const char* str = luaL_checklstring(L, 2, &len);
	printf("come from test: num = %d	str = %s	len = %d\n", num, str, len);
	return 0;
}

int luaopen_myLib(lua_State *L)
{
	luaL_Reg l[] = 
	{
		{"test", test},
		{NULL, NULL}
	};

	luaL_newlib(L, l);
	return 1;
}


luaL_checkinteger() 和 luaL_checklstring()是用来获取参数的。


如何生成 .so 动态库?

gcc -fPIC -shared -o myLib.so myLib.c

详见:【C/C++】动态库与静态库


接着用lua调用:

--设置.so搜寻路劲
package.cpath = "./?.so" 
--加载我们自定义的库mylib.so
local myLib = require "myLib"

myLib.test(666, "mick")

输出如下:

come from test: num = 666	str = mick	len = 4


以上仅仅是简单的从lua中获取了数据并打印出来,关于数据的返回,还涉及到lua虚拟栈,后面在做详细学习。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值