Mogę użyć nif, jeśli sam napiszę ten skrypt, ale kiedy używam zbrojenia, nie można znaleźć funkcji nif. Myślę, że to dlatego, że obiekty * .so nie są upakowane jak pliki belek. Oto prosty przykład;erlang rebar escriptize & nifs
rebar.config
:
{deps, [
{'jiffy', "", {git, "https://github.com/davisp/jiffy.git", {branch, master}}}
]}.
{escript_incl_apps, [jiffy]}.
%% I tried this to see what happens if the so got in there but didn't help
{escript_incl_extra, [{"deps/jiffy/priv/jiffy.so", "/path/to/my/proj"}]}.
test.erl
:
-module(test).
-export([main/1]).
main(_Args) ->
jiffy:decode(<<"1">>),
ok.
zbrojenie get-deps skompilować escriptize
./test
a wynik jest
escript: exception error: undefined function jiffy:decode/1
in function test:main/1 (src/test.erl, line 7)
in call from escript:run/2 (escript.erl, line 741)
in call from escript:start/1 (escript.erl, line 277)
in call from init:start_it/1
in call from init:start_em/1
Czy istnieje sposób na pokonanie tego?
Z błędu wygląda na to, że 'jiffy.beam' nie może zostać znaleziony, a nie' * .so'. Może 'escriptize' bierze pod uwagę tylko wiązki z' ebin' ignorujących zależności '' ebin's? –
@ Ed'ka, nie, jeśli dodasz zależność, która nie jest nif, działa dobrze. – cashmere
Ale jeśli spróbujesz wywołać 'jiffy: decode/1' z' jiffy.so' usuniętym z 'priv' powinieneś otrzymać błąd' Failed to load NIF library', a nie 'undefined function' –