Как я могу вызвать Lua-скрипты из C-программы? - PullRequest
3 голосов
/ 08 марта 2019

У меня есть 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' no file './foo.so'

Я думаю, это потому, что foo.lua не загружается в виртуальную машину lua, но я не могу найти API, например, загрузить файлы или сделать файлы. Так что мне делать?

1 Ответ

2 голосов
/ 08 марта 2019

Работает нормально, ваш 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...