9

こんにちは、Erlang NIF (ネイティブ実装関数) のHello Worldの例を取得しようとしています http://www.erlang.org/doc/man/erl_nif.htmlに示され ている OSX 64 ビットの Elixir から動作します。

まず、C コードを作成します。

/* niftest.c */
#include "erl_nif.h"

static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
    return enif_make_string(env, "Hello world!", ERL_NIF_LATIN1);
}

static ErlNifFunc nif_funcs[] =
{
    {"hello", 0, hello}
};

ERL_NIF_INIT(niftest,nif_funcs,NULL,NULL,NULL,NULL)

gcc次に、ここで提案されているように、64ビットアーキテクチャ を使用してコンパイルに成功しましたErlang NIF Test -- OS X Lion

gcc -undefined dynamic_lookup -dynamiclib niftest.c -o niftest.so -I /usr/local/Cellar/erlang/R14B02/lib/erlang/usr/include

niftest.soこれにより、 Erlang/Elixir からインターフェイスできるようにするために必要なファイルが生成されます。私の Elixir (niftest.ex) は次のようになります (ここで報告されているより複雑な例に触発されています):

defmodule Niftest do
 @onload :init
  def init() do
    :erlang.load_nif("./niftest", 0)
    :ok
  end

  def hello() do
    "NIF library not loaded"
  end

end

同じディレクトリにある niftest.so と niftest.ex を使用して、エリクサーを起動しiexて入力するNiftest.helloと、「NIF ライブラリがロードされていません」というメッセージが返されます。

私は重要なステップを逃していますか?- 助けてください!

4

1 に答える 1

11

ライブラリのロードが静かに失敗しています。以下を使用して、成功したことをアサートできます。

:ok = :erlang.load_nif("./niftest", 0)

これにより、エラーが発生します。

** (MatchError) no match of right hand side value:
{:error, {:bad_lib, 'Library module name \'niftest\' does not match calling module \'\'Elixir.Niftest\'\''}}
niftest.ex:4: Niftest.init/0

これは、NIF ライブラリが「所有」モジュールからしか呼び出せないために発生します。そのモジュールの名前はERL_NIF_INITマクロの最初の引数であるため、その呼び出しを変更して再コンパイルすることでこれを修正できます。

ERL_NIF_INIT(Elixir.Niftest,nif_funcs,NULL,NULL,NULL,NULL)

ロードフックにもタイプミスがあります。そのはず:

@on_load :init
于 2015-04-27T10:16:12.413 に答える