在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错误:
(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错误
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
这次终于成功了,出现正常的提示符:
Eshell V5.8.4 (abort with ^G)
1>
输入如下命令(后面必须带英文句号.):
退出控制台。
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,输入
编译出tut.beam文件。
然后输入
输出:
ok
6. 关于Erlang/OTP的用法和模块帮助请参考官方文档:
http://www.erlang.org/doc/man_index.html
或者参考这本书:
《Programming Erlang》
自己对Erlang的了解不多,所以就不多说了。