一般来说,我是rebar和erlang的初学者。根据本教程:http://www.metabrew.com/article/erlang-rebar-tutorial-generating-releases-upgrades,我试图使用rebar创建一个erlang版本,但在运行生成的版本时遇到了麻烦。
我的系统是Ubuntu11.04 64位,erlang R14B03,从源码安装。
当我调用'bin/somenode console‘时,我得到了以下错误之一:
Exec: /home/ghik/Inz/somerel/rel/somenode/erts-5.8.4/bin/erlexec -boot /home/ghik/Inz/somerel/rel/somenode/releases/1/somenode -mode embedded -config /home/ghik/Inz/somerel/rel/somenode/etc/app.config -args_file /home/ghik/Inz/somerel/rel/somenode/etc/vm.args -- console
Root: /home/ghik/Inz/somerel/rel/somenode
{"init terminating in do_boot",{'cannot load',hipe_amd64_encode,get_files}}
Crash dump was written to: erl_crash.dump
init terminating in do_boot ()有趣的是,每次我运行它时,列出的是不同的atom而不是'hipe_amd64_encode',例如:'hipe_amd64_defuse','hipe_amd64_assemble‘等。我猜erlang无法加载hipe,但我不知道为什么要首先尝试加载它。该版本只包含一个非常简单的应用程序,仅依赖于内核和stdlib。
出于某种原因,rebar会生成一个包含许多不必要应用程序的.rel文件:
%% rel generated at {2011,9,6} {20,5,48}
{release,{"somenode","1"},
{erts,"5.8.4"},
[{kernel,"2.14.4"},
{stdlib,"1.17.4"},
{sasl,"2.1.9.4"},
{someapp,"1"},
{compiler,"4.7.4",load},
{crypto,"2.0.3",load},
{et,"1.4.3",load},
{gs,"1.5.13",load},
{hipe,"3.8",load},
{inets,"5.6",load},
{mnesia,"4.4.19",load},
{observer,"0.9.9",load},
{public_key,"0.12",load},
{runtime_tools,"1.8.5",load},
{ssl,"4.1.5",load},
{syntax_tools,"1.6.7.1",load},
{tools,"2.6.6.4",load},
{webtool,"0.8.8",load},
{wx,"0.98.10",load}]}.为什么rebar在.rel文件中列出许多应用程序?如果没问题,为什么不开始发布呢?
发布于 2011-09-09 00:58:47
首先,您可以尝试通过向VM添加参数init_debug来查看在VM引导过程中发生了什么故障:
$ erl -init_debug
{progress,preloaded}
{progress,kernel_load_completed}
{progress,modules_loaded}
{start,heart}
{start,error_logger}
{start,application_controller}
{progress,init_kernel_started}
...
{progress,applications_loaded}
{apply,{application,start_boot,[kernel,permanent]}}
{apply,{application,start_boot,[stdlib,permanent]}}
{apply,{c,erlangrc,[]}}
{progress,started}
Erlang R14B03 (erts-5.8.4) [source] [64-bit] [smp:4:4] [rq:4] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.8.4 (abort with ^G)
1>使用此工具,您将能够更详细地查看正在进行的各种交互。可能是库的加载顺序错误,你不支持原生的,等等。
第二个问题是包含太多应用程序的rel文件。这可能是因为Rebar使用Reltool来生成版本,并且可以根据控件在生成版本时的粒度加载不同的应用程序(请参阅文档中的incl_cond材料)。在《向你学习一些Erlang》的Release is The Word章节中有几个例子:
{sys, [
{lib_dirs, ["/home/ferd/code/learn-you-some-erlang/release/"]},
{erts, [{mod_cond, derived}, % derived makes it pick less stuff
{app_file, strip}]},
{rel, "erlcount", "1.0.0", [kernel, stdlib, ppool, erlcount]},
{boot_rel, "erlcount"},
{relocatable, true},
{profile, embedded}, % reduces the files included from each app
{app_file, strip}, % reduces the size of app files if possible
{incl_cond, exclude}, % by default, don't include apps. 'derived' is another option
{app, stdlib, [{mod_cond, derived}, {incl_cond, include}]}, % include at the app
{app, kernel, [{incl_cond, include}]}, % level overrides the
{app, ppool, [{vsn, "1.0.0"}, {incl_cond, include}]}, % exclude put earlier
{app, erlcount, [{vsn, "1.0.0"}, {incl_cond, include}]}
]}.这应该会产生较小的发行量。
发布于 2011-12-02 16:11:11
在reltool.config中添加以下行:
{app, hipe, [{incl_cond, exclude}]}发布于 2011-09-08 08:19:14
我不知道好的答案,但我知道我不能在几个不同内核的CentOS版本上启动一个发行版,所以这并不是什么不寻常的事情。升级到5.6使它终于可以工作了。你可以在这里看到哪些OSes每天都会被测试:
http://www.erlang.org/doc/installation_guide/INSTALL.html#id62915
另外,我想你可以在没有HIPE的情况下编译。
https://stackoverflow.com/questions/7324556
复制相似问题