【问题标题】:Luad using stand-alone Lua使用独立 Lua 的 Luad
【发布时间】:2012-06-21 10:33:32
【问题描述】:

编辑:这已被归结为共享库、d 运行时和 os x 的一个更普遍的问题。见这里:Initializing the D runtime on OS X

我正在尝试从 Lua 独立解释器访问一个简单的 d 函数。

我看不到让 lua 实例识别 d 库的直接显而易见的方法,所以我尝试了这个 hack

import luad.all, luad.c.all;

extern (C) int luaopen_luad_test(lua_State* L) {
    auto lua = new LuaState(L);
    lua["addition"] = &addition;
    return(0);
}

int addition(int a, int b)
{
    return(a+b);
}

我知道当我调用 require("luad_test") 时,它会调用 luaopen_luad_test(lua_State* L) 让我可以访问解释器的 lua_State。但是,当我调用 require 时,我只会遇到段错误。

我是不是完全看错了?

编辑:我在 os x 上使用 lua 5.1.5,我已将 ";?.dylib" 添加到 package.cpath 以允许加载 .dylib 而不是 .so

edit2:我缩小了一点。在 luaopen_luad_test 中使用 new 会导致段错误。

【问题讨论】:

    标签: lua d lua-api


    【解决方案1】:

    一种可能是您没有设置 D 运行时并且 GC 未处于有效状态。

    我从来没有使用过 luad(或没有提供主要功能的 D),所以我可能会偏离基础。

    【讨论】:

    • 几乎可以肯定是这样,但是使用初始化函数启动运行时也会导致段错误。
    【解决方案2】:

    您必须初始化 D 运行时库。请尝试以下操作:

    import luad.all, luad.c.all;
    
    extern (C) int luaopen_luad_test(lua_State* L) {
      Runtime.initialize();
      static __gshared LuaState lua = new LuaState(L);
      lua["addition"] = &addition;
      return(0);
    } // luaopen_luad_test() C function
    
    int addition(int a, int b) {
      return(a+b);
    } // addition() function
    

    【讨论】:

    • (来自 #d 的文档)调用 Runtime.initialize 也会导致段错误,因此它永远不会到达 __gshared LuaState 等...
    • OS X Lion,使用 dmd 2.059 编译并使用 Lua 5.1.5 运行
    • 我做了一个快速测试,从 c 加载一个用 d 编写的 .dylib,得到了完全相同的问题。似乎在 os x 上设置运行时不仅仅是调用 Runtime.initialize()
    • 看到这不再是一个 luad 问题,我开始了一个新问题:stackoverflow.com/questions/11170139/…
    猜你喜欢
    • 2011-08-10
    • 2010-09-16
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    相关资源
    最近更新 更多