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是最重要事情。

You may also like...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据