我有一个nif库,每次重新编译它时,我都必须重新启动shell来重新加载或升级这个库。
下面是我的Erlang代码:
-module(q4).
-export([init/0]).
-on_load(init/0).
init() ->
erlang:load_nif("./q4_nif", reload).
每次编译Erlang模块时,都会出现以下错误:
`The on_load function for module q4 returned {error,
{upgrade,
"Upgrade not supported by this NIF library."}}`
并且当我调用init/0
函数时,会出现以下错误:{error,{reload,"Reload not supported by this NIF library."}}
有没有办法修复这个问题并在不重新启动shell的情况下加载新的nif库?
2条答案
按热度按时间qnyhuwrf1#
如错误消息所示,您需要在NIF中提供一个
upgrade
函数,该函数在对ERL_NIF_INIT
的调用中指定:升级功能记录在
erl_nif
man page中。0h4hbjxa2#
UPDATE找到根本原因
**似乎在热重新加载NIF之前必须调用 * 两次 *
delete
。**这似乎是一个Erlang错误。即使在
ERL_NIF_INIT
中实现了upgrade
,仍然存在一些问题,这些问题可能是特定于平台的,也可能不是特定于平台的。在Erlang存根模块中调用load_nif
之后,您可以随意删除priv/{{module}}.so
,它将继续执行,而不会真正重新加载NIF.so。