【问题标题】:How can I call Lua scripts from a C program?如何从 C 程序调用 Lua 脚本?
【发布时间】:2019-07-30 10:07:05
【问题描述】:

我有 2 个 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, "Couldn't load file: %s\n", lua_tostring(L, -1));
        exit(1);
    }

    result = lua_pcall(L, 0, LUA_MULTRET, 0);
    if (result) {
        fprintf(stderr, "Failed to run script: %s\n", lua_tostring(L, -1));
        exit(1);
    }

    lua_close(L);

    return 0;
}

它会引发运行时错误:

运行脚本失败:main.lua:130:找不到模块“foo”:没有字段 package.preload['foo'] 没有文件 '/usr/local/share/lua/5.3/foo.lua' 没有 文件 '/usr/local/share/lua/5.3/foo/init.lua' 没有文件 '/usr/local/lib/lua/5.3/foo.lua' 没有文件 '/usr/local/lib/lua/5.3/foo/init.lua' 没有文件 './foo.lua' 没有文件 './foo/init.lua' 没有文件 '/usr/local/lib/lua/5.3/foo.so' 没有文件 '/usr/local/lib/lua/5.3/loadall.so' 没有文件'./foo.so'

我认为是因为 foo.lua 没有加载到 lua 虚拟机中,但是我找不到像 load files 或 do files 这样的 API。那我该怎么办?

【问题讨论】:

    标签: c lua


    【解决方案1】:

    没问题,你的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 程序代码。

    【讨论】:

      猜你喜欢
      • 2010-11-15
      • 2018-04-23
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      • 2018-08-31
      • 2014-08-06
      • 1970-01-01
      相关资源
      最近更新 更多