4

編集: これは、共有ライブラリ、d ランタイム、および os x のより一般的な問題にまで追跡されています。こちらをご覧ください: OS X での D ランタイムの初期化

Lua スタンドアロン インタープリターからアクセスできる単純な d 関数を取得しようとしています。

Luaインスタンスに広告ライブラリを認識させるためのすぐに明白な方法が見つからなかったので、このハックを試しました

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 を呼び出すと、seg fault が発生します。

私はこれを完全に間違った方法で見ていますか?

編集:私は os x で lua 5.1.5 を使用しており、.so の代わりに .dylib をロードできるようにするために、package.cpath に「;?.dylib」を追加しました。

edit2: 少し絞り込みました。luaopen_luad_test で new を使用すると、segfault が発生します。

4

2 に答える 2

2

1 つの可能性として、D ランタイムをセットアップしておらず、GC が有効な状態にないことが考えられます。

私はluad(またはメイン機能を提供していないD)を使用したことがないので、ベースから外れている可能性があります。

于 2012-06-21T19:06:17.447 に答える
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
于 2012-06-22T11:21:00.597 に答える