使用 Lua 调用 C(在 Linux 中)

我制作了一个 C 程序,并在其中编写了以下两个函数

1. int c_add(lua_State* L)
   {...一些代码...
   }
2. int main(int argc, char* argv)
   {...一些代码...
   lua_register(L, "c_add", c_add);
   } 

并通过以下命令成功编译。

gcc -o test.exe test.c -I /home/ec2-user/install/lua-5.1.5/src -llua-5.1

但在使用 lua 程序调用它之后出现以下错误。

lua: func2.lua:2: attempt to call global 'c_add' (a nil value)

如何解决这个问题?`

点赞
用户1009432
用户1009432

你需要将代码编译成共享库,以便从外部 Lua 实例中访问 C 函数。你不需要 main 函数,并且需要将 -shared 标志传递给 gcc。然后你需要让 Lua 知道当 require 被调用时该做什么,通过实现以下函数:

//             与 .so/.dll 的名称相同
//                      v
LUALIB_API int luaopen_test(lua_State *L) {
    lua_register(L, "c_add", c_add);
    return 0;
}

这将创建一个单一的全局函数。最好使用 luaL_register 注册一个 luaL_Reg 函数数组:

static const luaL_Reg function_list[] = {
    {"c_add",   c_add},
    {NULL, NULL}
};

LUALIB_API int luaopen_test(lua_State *L) {
    luaL_register(L, "test", function_list);
    return 1;
}

这样 require 就会返回一个函数表:

local my_c_functions = require("test")
print(my_c_functions.c_add(42, 42))
2018-12-20 17:18:13