lua 调用c动态库中的函数
lua 调用c动态库中的函数示例如下:
1. 找个linux系统安装一下环境
sudo apt install luajit
sudo apt install liblua5.1-0-dev
2. 新建一个.c文件用于生成.so库内容如下:假设文件名为test.c
/***********************************************************
File name : test.c
Author name : lancz
Email address : chengzhang.lan@test.com
Create time : 2021-06-24 03:08:22
***********************************************************/
#include <stdio.h>
#include <lua5.1/lua.h>
#include <lua5.1/lualib.h>
#include <lua5.1/lauxlib.h>
static int lua_c_test(lua_State *S)
{
if (!S)
return -1;
double para1 = luaL_checknumber(S, 1);
printf("call %s success, input parameter:%lf\n", __func__, para1);
lua_pushnumber(S, 123.456);
lua_pushstring(S, "hello world");
return 2;
}
int luaopen_test(lua_State *S) {
luaL_Reg t[] = {
{"test1", lua_c_test},
{NULL, NULL}
};
luaL_openlib(S, "fuck", t, 0);
return 1;
}
3. 将2中的文件编译生成.so库
gcc test.c -fpic -shared -o test.so
4. 在test.so同级目录下新建一个test_again.lua文件,将以下内容写上
package.cpath = "./?.so"
local f = require "test"
printf("return value:%f, %s\n", f.test1(123.456))
5. 运行luajit fm.lua看到如下结果:
lancz@DESKTOP-SA0Q5TR:~$ luajit fm.lua
call lua_c_test success, input parameter:123.456000
return value:123.456000, hello world
这里几个注意事项:
1. test.c中int luaopen_test(lua_State *S) 函数下划线之后的名称要和生成的test.so名称一样
2. 这里因为库放在和测试用的.lua文件同一个目录,所以不能再有test.lua, 所以才把测试用的lua文件命名为fm.lua
能否明白我为啥要命名为fm是最重要事情。