如何从 C 语言程序中调用 Lua 脚本?

我有两个 Lua 脚本,其中一个需要另一个脚本。那么,我该如何从 C 语言程序中调用它呢?

例如:

main.lua

local foo = require "foo"

function main()
    foo.bar()
end

main()

foo.lua

function bar( )
    io.write("hello, world!\n")
end

这是我的 C 语言程序:

#include <lauxlib.h>
#include <lua.h>
#include <lualib.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    int status, result;
    lua_State *L;
    L = luaL_newstate();
    luaL_openlibs(L);

    status = luaL_loadfile(L, "main.lua");
    if (status) {
        fprintf(stderr, "无法加载文件:%s\n", lua_tostring(L, -1));
        exit(1);
    }

    result = lua_pcall(L, 0, LUA_MULTRET, 0);
    if (result) {
        fprintf(stderr, "脚本运行失败:%s\n", lua_tostring(L, -1));
        exit(1);
    }

    lua_close(L);

    return 0;
}

它会抛出运行时错误:

脚本运行失败:main.lua:130: module 'foo' not found: no field package.preload['foo'] no file '/usr/local/share/lua/5.3/foo.lua' no file '/usr/local/share/lua/5.3/foo/init.lua' no file '/usr/local/lib/lua/5.3/foo.lua' no file '/usr/local/lib/lua/5.3/foo/init.lua' no file './foo.lua' no file './foo/init.lua' no file '/usr/local/lib/lua/5.3/foo.so' no file '/usr/local/lib/lua/5.3/loadall.so' no file './foo.so'

我认为这是因为 foo.lua 没有加载到 Lua 虚拟机中,但是我找不到加载文件或执行文件的 API。那么,我该怎么办呢?

点赞
用户5420570
用户5420570

它可以正常工作,你的foo.lua有误,请将其更改为:

local foo = {}

function foo.bar()
    io.write("Hello World!\n")
end

return foo

然后它就可以运行了:

$ ls
foo.lua  luabr.c  main.lua
BladeMight ~/lua/tests/605
$ gcc luabr.c -llua && ./a
Hello World!

\*\* luabr.c 是你的C程序代码。

2019-03-08 11:32:36