2010-07-15 124 views
5

我正在尝试将lproc程序的例子(介绍编程Lua,第30章)加载到Lua中,并以某种方式弄脏了它。我正在关注这个 - http://www.lua.org/pil/26.2.html让我的c模块进入lua。以下是我所采取的步骤:在Lua中加载一个C模块

  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已经过时 – 2010-07-15 23:32:43

+0

我从Macports下载了Lua 5.1.4。 – Sayan 2010-07-16 01:16:10

回答

1

这里是建设Lua的C库(工作在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! 
>