Elixir NIF- x64 上的 Hello World 示例 Mac OSX
Elixir NIF- Hello World example on x64 Mac OSX
您好,我正在尝试获取此处显示的 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
它会生成我应该能够从 Erlang/Elixir 连接到的必要文件 niftest.so
。我的 Elixir (niftest.ex) 看起来像这样(灵感来自报告的一个更复杂的示例 here):
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
启动 elixir 并输入 Niftest.hello
,我得到的结果是:"NIF library not loaded"
我错过了关键的一步吗? - 请帮忙!
库的加载正在无提示地失败。您可以断言它成功使用:
: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
发生这种情况是因为只能从其 "owning" 模块调用 NIF 库。该模块的名称是 ERL_NIF_INIT
宏的第一个参数,因此您可以通过更改该调用并重新编译来解决此问题:
ERL_NIF_INIT(Elixir.Niftest,nif_funcs,NULL,NULL,NULL,NULL)
加载挂钩也有错别字。应该是:
@on_load :init
您好,我正在尝试获取此处显示的 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
它会生成我应该能够从 Erlang/Elixir 连接到的必要文件 niftest.so
。我的 Elixir (niftest.ex) 看起来像这样(灵感来自报告的一个更复杂的示例 here):
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
启动 elixir 并输入 Niftest.hello
,我得到的结果是:"NIF library not loaded"
我错过了关键的一步吗? - 请帮忙!
库的加载正在无提示地失败。您可以断言它成功使用:
: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
发生这种情况是因为只能从其 "owning" 模块调用 NIF 库。该模块的名称是 ERL_NIF_INIT
宏的第一个参数,因此您可以通过更改该调用并重新编译来解决此问题:
ERL_NIF_INIT(Elixir.Niftest,nif_funcs,NULL,NULL,NULL,NULL)
加载挂钩也有错别字。应该是:
@on_load :init