在Lua中加载C模块

我正在尝试将 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: 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 中进行什么操作?时间很短,我肯定在做一些可怕的事情,欢迎任何指导。

谢谢,

Sayan

原文链接 https://stackoverflow.com/questions/3260858

点赞
stackoverflow用户107090
stackoverflow用户107090

最简单的方式是创建一个共享库并且动态加载你的 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 中找到。

2010-07-16 02:07:06
stackoverflow用户1793220
stackoverflow用户1793220

以下是构建适用于 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!
>

2017-11-17 12:28:29