在Lua中加载一个C模块
我正在尝试将lproc程序的例子(介绍编程Lua,第30章)加载到Lua中,并以某种方式弄脏了它。我正在关注这个 - http://www.lua.org/pil/26.2.html让我的c模块进入lua。以下是我所采取的步骤:在Lua中加载一个C模块
我有一个lproc.h和lproc.c(含正是在这本书的第30章中规定的功能)。我编译lproc.c为--- gcc -c lproc.c -DLUA-USERCONFIG = \“lproc.h \”
我从lproc.o中创建了一个库,命名相同。
然后按照指示编译lua.c。我的头文件包含宏LUA_EXTRALIBS和方法声明。
走到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呢?时间很短,我正在做一些可怕的错误,任何方向都会受到欢迎。
感谢,
萨扬
最简单的方法是创建一个共享库和动态加载你的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
谢谢,我会试试看! – Sayan 2010-07-16 04:30:14
这里是建设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!
>
您使用的是哪个版本的Lua?在线PIL已经过时 – 2010-07-15 23:32:43
我从Macports下载了Lua 5.1.4。 – Sayan 2010-07-16 01:16:10