erlang Rebar escriptize & nifs

9

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 :

%Vor%

test.erl :

%Vor%

rebar get-deps kompilieren escriptize
./test

und das Ergebnis ist

%Vor%

Gibt es einen Weg, dies zu überwinden?

    
cashmere 25.03.2013, 14:45
quelle

2 Antworten

3

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:

%Vor%

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.

    
rvirding 28.03.2013, 15:34
quelle
1

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.

    
lastcanal 27.03.2013 19:36
quelle

Tags und Links