Elixir NIF- x64 Mac OSX上的Hello World示例

Gav*_*aff 9 macos erlang native elixir erlang-nif

嗨,我正在尝试获取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)
Run Code Online (Sandbox Code Playgroud)

然后我使用gcc64位架构成功编译它,如 Erlang NIF测试 - OS X Lion所示

gcc -undefined dynamic_lookup -dynamiclib niftest.c -o niftest.so -I /usr/local/Cellar/erlang/R14B02/lib/erlang/usr/include
Run Code Online (Sandbox Code Playgroud)

它产生了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
Run Code Online (Sandbox Code Playgroud)

现在使用niftest.so和niftest.ex在同一个目录中我使用iex并输入elixir 并输入Niftest.hello所有内容后:"NIF库未加载"

我错过了重要的一步吗?- 请帮忙!

Paw*_*rok 11

库的负载无声地失败.您可以声明它成功使用:

:ok = :erlang.load_nif("./niftest", 0)
Run Code Online (Sandbox Code Playgroud)

这会导致错误:

** (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
Run Code Online (Sandbox Code Playgroud)

这是因为NIF lib只能从其"拥有"模块中调用.该模块的名称是ERL_NIF_INIT宏的第一个参数,因此您可以通过更改该调用并重新编译来解决此问题:

ERL_NIF_INIT(Elixir.Niftest,nif_funcs,NULL,NULL,NULL,NULL)
Run Code Online (Sandbox Code Playgroud)

加载钩子中也有一个拼写错误.它应该是:

@on_load :init
Run Code Online (Sandbox Code Playgroud)

  • `@ onload`不起作用,因为它应该是`@ on_load`.更新了答案 (3认同)