在Windows下解压安装Erlang/OTP

(待考,未稳定)

1. 下载Erlang/OTP的win32安装包

http://www.erlang.org/download.html

下载其中的otp_win32_R14B03.exe

2. 用7zip把安装文件解压到硬盘。

我的解压目录是D:\java\otp_win32_R14B03

3. 安装VC2005运行时

在解压目录下有个vcredist_x86.exe

双击执行安装。

4. 尝试执行erl

解压目录下有个叫$_OUTDIR目录。

在$_OUTDIR\bin下有个叫erl.exe和werl.exe

是Erlang/OTP的命令行控制台。

如果直接执行它们,会出现这样的错误提示:

Could not load module D:\java\otp_win32_R14B03\$_OUTDIR\erts-5.8.4\bin\erlexec.dll.

这个提示的起因不明,因为这个dll确实存在。

(可以用OllyDbg找到这个提示字符串的代码在哪里,不过最好看Erlang的实现)

我猜是因为$_OUTDIR\bin的erl.exe在自动搜索../erts-*/bin这个目录,结果找不到,

于是就报出这种极其诡异且脱线的错误(想模仿Linux下的软链接"ln -s"效果?)。

于是我把D:\java\otp_win32_R14B03\$_OUTDIR\bin目录整个复制(不是剪切)到

D:\java\otp_win32_R14B03\$_OUTDIR\erts-5.8.4\bin。

然后继续尝试执行bin目录下的erl.exe和werl.exe——

启动成功,但发生crash错误:

{"init terminating in do_boot",{badarg,[{erl_prim_loader,check_file_result,3},{init,get_boot,1},{init,get_boot,2},{init,do_boot,3}]}}
(no error logger present) error: "Error in process <0.2.0> with exit value: {badarg,[{erl_prim_loader,check_file_result,3},{init,get_boot,1},{init,get_boot,2},{init,do_boot,3}]}\n"

Crash dump was written to: erl_crash.dump
init terminating in do_boot ()


Abnormal termination

看样子是初始化失败,我把目录

D:\java\otp_win32_R14B03\$_OUTDIR\R14B03

下的所有文件复制到

D:\java\otp_win32_R14B03\$_OUTDIR\bin

目录下

然后继续尝试——

又出现crash错误

{"init terminating in do_boot",{'cannot load',error_handler,get_file}}

Crash dump was written to: erl_crash.dump
init terminating in do_boot ()


Abnormal termination

看样子有点像beam模块加载失败。

查看目录

D:\java\otp_win32_R14B03\$_OUTDIR\lib

发现lib目录下的模块子目录只有doc目录,

真正的beam模块文件全在

D:\java\otp_win32_R14B03\$_OUTDIR的子目录中

我猜测erl.exe和werl.exe尝试搜索../lib目录中的.beam文件,但找不到。

于是就出现init terminating in do_boot错误。

所以我保留bin, lib, src, doc, include和erts-5.8.4这几个目录,

其它子目录全部剪切到lib目录下。

然后执行werl.exe:

D:\java\otp_win32_R14B03\$_OUTDIR\bin\werl.exe

这次终于成功了,出现正常的提示符:

Erlang R14B03 (erts-5.8.4) [smp:4:4] [rq:4] [async-threads:0]

Eshell V5.8.4 (abort with ^G)
1>

输入如下命令(后面必须带英文句号.):

q().

退出控制台。

5. 测试erl脚本的编译

在bin目录下创建一个文件tut.erl

内容为:

-module(tut).
-export([hello/1]).

hello(Word)->io:format("hello, ~s~n", [Word]).

其中:

第一行-module(tut).表示模块名为tut(和文件名一样)。

第二行-export([hello/1]).表示导出hello方法,带1个参数。

第三行是hello方法的实现,使用io:format输出内容到控制台。

在Erlang中变量需要以大写字母开头(也可以是下划线_开头),所以这里参数用大写开头(但参数不一定是变量)。

对于io:format方法,破浪线表示转义(用法类似于C语言的printf)。

保存后打开werl.exe,输入

c(tut).

编译出tut.beam文件。

然后输入

tut:hello("world").

输出:

hello, world
ok

6. 关于Erlang/OTP的用法和模块帮助请参考官方文档:

http://www.erlang.org/doc/

http://www.erlang.org/doc/man_index.html

或者参考这本书:

《Programming Erlang》

自己对Erlang的了解不多,所以就不多说了。

 
应用领域的介绍可参考这个中文ppt
 
 

相关推荐