2010-07-15 5 views
5

Я пытаюсь загрузить пример Lproc (описанный в Программе Lua, глава 30) в Lua и каким-то образом засориться. Я следую за этим - http://www.lua.org/pil/26.2.html, чтобы получить мой модуль c в lua. Ниже перечислены шаги, которые я взял:Загрузка модуля 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? Время короткое, и я делаю что-то ужасно неправильно, любое направление будет приветствоваться.

Спасибо,
Саян

+0

Какая версия Lua вы используете? Онлайновый PIL устарел –

+0

Я загрузил Lua 5.1.4 из Macports. – Sayan

ответ

7

Самый простой способ создать общую библиотеку и загрузить модуль 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

+0

Спасибо, я попробую их! – Sayan

1

Вот полный и полностью портативный минимальный пример создания библиотеки 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; 
} 

Поместите этот rockspec файл в том же каталоге, названный 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! 
> 
Смежные вопросы