Ich kann nifs verwenden, wenn ich das escript selber schreibe, aber wenn ich rebar schreibe, können die nif-Funktionen nicht gefunden werden. Ich denke es ist, weil * .so Objekte nicht wie Strahldateien gepackt werden. Hier ist ein einfaches Beispiel;
rebar.config
:
test.erl
:
rebar get-deps kompilieren escriptize
./test
und das Ergebnis ist
%Vor%Gibt es einen Weg, dies zu überwinden?
Das Problem ist, dass die Funktion erlang:load_nif/1
nicht implizit irgendeinen Suchpfad verwendet noch etwas Kluges unternimmt, um die .so
-Datei zu finden. Es versucht nur, die Datei wörtlich zu laden, wie sie durch das Argument Dateiname angegeben wird. Wenn es sich nicht um einen absoluten Dateinamen handelt, wird versucht, die Datei relativ zum aktuellen Arbeitsverzeichnis zu laden. Es lädt genau , was Sie sagen, es zu laden.
Wenn Sie also erlang:load_nif("jiffy.so")
aufrufen, wird versucht, "jiffy.so"
von Ihrem aktuellen Arbeitsverzeichnis zu laden. Eine einfache Umgehung, die ich verwendet habe, ist etwas zu tun, das die Umgebungsvariable NIF_DIR
verwendet:
Dies kann einfach erweitert werden, um einen Suchpfad zu durchlaufen, um die Datei zu finden. Beachten Sie, dass NIF_DIR
kein spezieller Name ist, sondern nur einer, den ich "erfunden" habe.
Es scheint nicht möglich, ein NIF aus einem E-Skript zu laden, weil erlang:load_nif
nicht in Archive schaut. Dies liegt daran, dass die meisten Betriebssysteme eine physische Kopie von *.so
benötigen, die dem Speicher zugeordnet werden kann.
Der beste Weg, dies zu überwinden, ist das Kopieren der * .so-Dateien in das Ausgabeverzeichnis des E-Skripts.
%Vor% Sehen Sie sich den Skript-Builder für edis
an. Sie werden sehen, dass sie das nif des eleveldb zur Ausführung aus einem Skript laden.
Tags und Links erlang rebar erlang-nif