Elixir NIF-Hello World exemple sur x64 Mac OSX

Salut, je vais essayer d'obtenir les Hello World exemple pour Erlang NIF (Fonction Native Implemented) montré ici http://www.erlang.org/doc/man/erl_nif.html pour travailler à partir D'Elixir sur OSX 64bit.

je crée d'Abord le code 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)

puis je le compilerai avec succès en utilisant gcc pour l'architecture 64 bits comme suggéré ici 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

qui produit le fichier nécessaire niftest.so que je devrais pouvoir me connecter à partir D'Erlang / Elixir. Mon Élixir (niftest.ex) ressemble à ceci (inspiré par un exemple plus complexe rapporté ici):

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

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

end

maintenant avec niftest.so and niftest.ex dans le même répertoire que je lancer d'élixir à l'aide de iex et tapez Niftest.hello et tous les je serai de retour est: "de la FIV de la bibliothèque n'est pas chargé"

est-ce que je manque une étape vitale? - s'il vous plaît aider!

8
demandé sur Community 2015-04-27 12:29:10

1 réponses

la charge de la bibliothèque tombe silencieusement. Vous pouvez affirmer qu'il réussit en utilisant:

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

il en résulte une erreur:

** (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

cela se produit parce qu'une lib NIF ne peut être appelée que depuis son module "propriétaire". Le nom de ce module est le premier argument de la ERL_NIF_INIT macro, de sorte que vous pouvez corriger cela en changeant cet appel et en recompilant:

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

Il y a aussi une faute de frappe dans le crochet. Il devrait être:

@on_load :init
11
répondu Paweł Obrok 2015-04-27 10:55:51