首页 文章

在Lua中加载C模块

提问于
浏览
5

我正在尝试将示例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做什么?时间很短,我做了一件可怕的事,任何方向都会受到欢迎 .

谢谢,
萨扬

2 回答

  • 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

    这是一个为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!
    >
    

相关问题