我正在尝试将示例lproc程序(在编程Lua,第30章中描述)加载到Lua中并以某种方式弄脏。我正在关注这个 - http://www.lua.org/pil/26.2.html以使我的c模块进入lua。以下是我采取的步骤:
我有一个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做什么?时间很短,我正在做一些可怕的事情,任何方向都会受到欢迎。
谢谢,
萨扬
答案 0 :(得分: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
中有解释答案 1 :(得分: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!
>