如何解决Erlang:使用主管启动sellaprime应用程序返回undef错误
尝试运行编程 erlang 书中的示例应用程序,sellaprime 应用程序。我使用主管内的测试功能测试了主管代码。所以,主管应该没问题。应用程序已加载,但应用程序启动遇到以下错误:
=INFO REPORT==== 31-May-2021::22:39:44.235167 ===
application: sellaprime
exited: {bad_return,{{sellaprime_app,start,[normal,[]]},{'EXIT',{undef,[{sellaprime_app,[]],[]},{application_master,start_supervisor,3,[{file,"application_master.erl"},{line,331}]},start_the_app,5,313}]},start_it_new,7,299}]}]}}}}
type: temporary
需要帮助定位错误。
这是文件,sellaprime_app.erl
:
-module(sellaprime_app).
-behavIoUr(application).
-export([start/2,stop/1]).
start(_Type,StartArgs) -> sellaprime_supervisor:start_link(StartArgs).
stop(_State) -> ok.
和sellaprime_supervisor.erl
:
-module(sellaprime_supervisor).
-behavIoUr(supervisor).
-export([start/0,start_in_shell_for_testing/0,start_link/1,init/1]).
start() ->
spawn(fun() -> supervisor:start_link({local,?MODULE},?MODULE,_Arg=[]) end).
start_in_shell_for_testing() ->
{ok,Pid} = supervisor:start_link({local,_Arg=[]),unlink(Pid).
start_link(Args) ->
supervisor:start_link({local,Args).
init([]) ->
gen_event:swap_handler(alarm_handler,{alarm_handler,swap},{my_alarm_handler,xyz}),{ok,{{one_for_one,10},[{tag1,{area_server,start_link,permanent,10000,worker,[area_server]},{tag2,{prime_server,[prime_server]}
]}}.
解决方法
这个:
{'EXIT',{undef,[{sellaprime_app,start,[normal,[]],[]},
是说有一个 undef
错误,即在模块 sellaprime_app
中没有定义名为 start()
的函数,它接受两个参数:[normal,[]]
。但是,如果您查看您的 sellaprime_app.erl
,显然有一个名为 start()
的函数,它被定义为接受任意两个参数。怎么回事?
问题是书中没有指导你编译文件sellaprime_app.erl
来创建所需的.beam
文件,所以erlang找不到里面的函数。您将遇到与所有其他源文件相同的问题。您可以使用命令行编译目录中的所有 .erl
文件,如下所示:
$ erlc *.erl
执行此操作后,您将在目录中看到 .beam
文件。然后你可以这样做:
$ erl -boot start_sasl -config elog3
...接下来是书中显示的其余命令。
rebar3
之类的工具负责为您完成所有编译工作,并将 .beam
文件组织到其他目录中并添加它们的路径,但是当您手动运行应用程序时则不会发生这种情况。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。