在Lua中加载C模块

时间:2010-07-15 23:26:42

标签: lua

我正在尝试将示例lproc程序(在编程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解释器,它出现了以下错误:

  5. > 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做什么?时间很短,我正在做一些可怕的事情,任何方向都会受到欢迎。

    谢谢,
    萨扬

2 个答案:

答案 0 :(得分:7)

最简单的方法是创建共享库并动态加载C模块。这样就避免了重建Lua解释器。 http://www.tecgraf.puc-rio.br/~lhf/ftp/lua/中有几个示例,http://www.tecgraf.puc-rio.br/~lhf/ftp/lua/install.htmlhttp://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!
>