在Lua中加载C模块

7
我正在尝试将例子lproc程序(Programming 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:找不到模块'lproc':
    没有字段包预加载['lproc']
    没有文件'./lproc.lua'
    没有文件'/opt/local/share/lua/5.1/lproc.lua'
    没有文件'/opt/local/share/lua/5.1/lproc/init.lua'
    没有文件'/opt/local/lib/lua/5.1/lproc.lua'
    没有文件'/opt/local/lib/lua/5.1/lproc/init.lua'
    没有文件'./lproc.so'
    没有文件'/opt/local/lib/lua/5.1/lproc.so'
    没有文件'/opt/local/lib/lua/5.1/loadall.so'
堆栈跟踪:
    [C]:function 'require'
    stdin:1:in main chunk
    [C]:?

似乎模块没有被注册,我需要从Lua做什么?时间紧迫,我肯定是做错了什么。 如有任何建议,请指教。

谢谢,
Sayan


你使用的是哪个版本的Lua?在线的PIL已经过时了。 - jA_cOp
我从Macports下载了Lua 5.1.4。 - Sayan
2个回答

9
这是一个完整且完全可移植的最小示例,展示如何为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!
> 

8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接