Загрузка модуля C в Lua - PullRequest
       4

Загрузка модуля C в Lua

5 голосов
/ 16 июля 2010

Я пытаюсь загрузить пример программы lproc (описанной в разделе Программирование Lua, глава 30) в Lua и как-то засоряется. Я следую за этим - http://www.lua.org/pil/26.2.html, чтобы получить мой модуль c в lua. Ниже приведены шаги, которые я предпринял:

  1. У меня есть lproc.h и lproc.c (в точности содержащие функции, изложенные в главе 30 книги). Я компилирую lproc.c как --- gcc -c lproc.c -DLUA-USERCONFIG = \ "lproc.h \"

  2. Я сделал библиотеку из lproc.o, названную так же.

  3. А затем скомпилировал lua.c в соответствии с инструкциями. Мои заголовочные файлы содержат макрос LUA_EXTRALIBS и объявления методов.

  4. Пошел к интерпретатору Lua, и он дал следующие ошибки:

> require "lproc"
stdin:1: module 'lproc' not found:
    no field package.preload['lproc']
    no file './lproc.lua'
    no file '/opt/local/share/lua/5.1/lproc.lua'
    no file '/opt/local/share/lua/5.1/lproc/init.lua'
    no file '/opt/local/lib/lua/5.1/lproc.lua'
    no file '/opt/local/lib/lua/5.1/lproc/init.lua'
    no file './lproc.so'
    no file '/opt/local/lib/lua/5.1/lproc.so'
    no file '/opt/local/lib/lua/5.1/loadall.so'
stack traceback:
    [C]: in function 'require'
    stdin:1: in main chunk
    [C]: ?

Кажется, что модуль не был зарегистрирован, что мне нужно сделать из Lua? Времени мало, и я делаю что-то ужасно неправильно, любое направление приветствуется.

Спасибо
Саян

Ответы [ 2 ]

7 голосов
/ 16 июля 2010

Самый простой способ - создать общую библиотеку и динамически загрузить модуль C.Этот способ избавляет от необходимости перестраивать интерпретатор Lua.Есть несколько примеров в http://www.tecgraf.puc -rio.br / ~ lhf / ftp / lua / и пояснениях в http://www.tecgraf.puc -rio.br / ~ lhf / ftp / lua / install.html и http://lua -users.org / wiki / BuildingModules

1 голос
/ 17 ноября 2017

Вот полный и полностью переносимый минимальный пример построения библиотеки C для Lua (работает в Lua 5.1-5.3 и LuaJIT для любой платформы):

С этим example.c:

#include <lua.h>

int example_hello(lua_State* L) {
   lua_pushliteral(L, "Hello, world!");
   return 1;
}

int luaopen_example(lua_State* L) {
   lua_newtable(L);
   lua_pushcfunction(L, example_hello);
   lua_setfield(L, -2, "hello");
   return 1;
}

Поместите этот файл rockpec в тот же каталог с именем example-1.0-1.rockspec:

package = "example"
version = "1.0-1"
source = {
   url = "." -- not online yet!
}
build = {
   type = "builtin",
   modules = {
      example = "example.c"
   }
}

Затем выполните luarocks make.Он создаст код C с правильными флагами для вашей платформы.

Ваш модуль готов к использованию!

Lua 5.3.3  Copyright (C) 1994-2016 Lua.org, PUC-Rio
> example = require("example")
> print(example.hello())
Hello, world!
> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...