在一台64位的Widnows2008上,安装了Erlang之后,运行erl,测试几条erlang语句,一切正常。但是在试图启动一个使用了SSL类库的应用程序时,出现了如下的提示:
Unable to load crypto library. Failed with error:
“load_failed, Failed to load NIF library c:/PROGRA~2/ERL58~1.2/lib/crypto-2.0.2/
priv/lib/crypto: ‘Unspecified error’”
OpenSSL might not be installed on this system.
“(pubSageService@Apptest2)1> i
=ERROR REPORT==== 21-Oct-2011::09:47:29 ===
The on_load function for module crypto returned {error,
{load_failed,
“Failed to load NIF library c:
/PROGRA~2/ERL58~1.2/lib/crypto-2.0.2/priv/lib/crypto: ‘Unspecified error’”}}
n(pubSageService@Apptest2)1> it terminating in do_boot”,{undef,[{crypto,start,[]
},{init,start_it,1},{init,start_em,1}]}}
Crash dump was written to: erl_crash.dump
init terminating in do_boot ()
该机器已经安装了64位的OpenSSL类库(下载http://www.slproweb.com/products/Win32OpenSSL.html)
Google之后找到了一篇Google Groups上面的讨论文章
http://groups.google.com/group/erlang-programming/browse_thread/thread/288684b61116baf3
首先怀疑Win32的 OpenSSL类库安装的有问题,于是重新安装了一遍,之前安装的忘记最后一步是否选择了将OpenSSL的类库拷贝打到系统目录下(Windows\System32\),重新安装的时候确认拷贝,但是启动仍然失败。
接下来又把那几个dll拷贝到Erlang的安装目录(就是上面的提示的那个目录):
c:/PROGRA~2/ERL58~1.2/lib/crypto-2.0.2/priv/lib/crypto
这个是缩写的目录,实际是:
C:\Program Files (x86)\erl5.8.2\lib\crypto-2.0.2\priv\lib
这次换了个错误提示:
Unable to load crypto library. Failed with error:
“load_failed, Failed to load NIF library c:/PROGRA~2/ERL58~1.2/lib/crypto-2.0.2/
priv/lib/crypto: ‘Unspecified error’”
OpenSSL might not be installed on this system.
“(pubSageService@Apptest2)1> i
=ERROR REPORT==== 21-Oct-2011::09:47:29 ===
The on_load function for module crypto returned {error,
{load_failed,
“Failed to load NIF library c:
/PROGRA~2/ERL58~1.2/lib/crypto-2.0.2/priv/lib/crypto: ‘Unspecified error’”}}
n(pubSageService@Apptest2)1> it terminating in do_boot”,{undef,[{crypto,start,[]
},{init,start_it,1},{init,start_em,1}]}}
Crash dump was written to: erl_crash.dump
init terminating in do_boot ()
又仔细看了一遍帖子,怀疑是64的OpenSSL和64位的Windows 2008不兼容,于是重新安装了一个32位的,一切正常~
之前碰到过一次,但是当时是和ssl的问题一起解决的,所以再一次的疏忽了,Erlang安装的时候一定要确认所有需要的库都正确安装了。
错误情况是在erl环境中运行 odbc:start(). 的时候
抛出如下的异常:
** exception error: undefined function odbc:start/0
该异常的解决办法和《Erlang {“no such file or directory”,”crypto.app”} 的解决方法》类似首先确认linux下安装了如下的包:
apt-get install unixodbc unixodbc-dev
接着重新安装erlang解决。
因为几次都碰到安装后某些类库无法使用的问题,总结了一下:
apt-get install gcc g++ build-essential m4 libncurses5-dev libssl-dev flex unixodbc-dev fop libwxbase2.8-dev libwxgtk2.8-dev libgl1-mesa-dev libglu1-mesa-dev libglut3-dev libncurses5-dev libc6 unixodbc gcj openssl xsltproc
还有一个
apt-get install sun-java6-jdk
如果这个包不能正确安装,说明更新源可能有问题,用编辑器打开/etc/apt/sources.list增加一个
deb http://http.us.debian.org/debian/ lenny main contrib non-free
然后保存关闭再次运行 apt-get update然后再安装,应该就没问题了。
库安装完成后在源码目录下
./configure –prefix=/usr/
make
make install
安装完成后输入erl就能使用最新的Erlang运行环境了
如果是直接apt-get install erlang的,就不用看这个了,我这个是erlang源码编译安装的说明。另外如果有错或者缺少某些类库,还请指出,谢谢。
一台新安装的Debian Linux 6.0, 安装了Erlang R14B02. 直接运行erl,输入一些测试,没有问题。但是部署一个Erlang的应用程序之后,启动出错,主要提示为:
{"no such file or directory","crypto.app"}
这个Erlang的应用程序用到了openssl相关的类库,检查了一遍系统的类库,发现 openssl-dev这个库没有安装,apt-get安装后继续出错,搜索发现erlang-ssl这个库没有,apt-get安装后还是无效。
最后发现一个成功解决的案例:
http://permalink.gmane.org/gmane.comp.networking.rabbitmq.general/5650
随后将Erlang卸载,重新编译安装(加这个参数 '–with-ssl=PATH')后一切正常。
后记:Erlang在编译的时候如果系统缺少一些类库,比如odbc,ssl等,会给出一些警告信息,但是并不会阻塞后面的安装,安装成功后一般会认为安装成功了(基本的测试也能通过),但是实际上一些erlang的类库并没有成功编译安装,这种情况下重新编译安装即可。
参考:http://www.erlang.org/doc/reference_manual/expressions.html
Erlang的比较运算符
| op | Description |
| == | 等于 |
| /= | 不等于 |
| =< | 小于等于 |
| < | 小于 |
| >= | 大于等于 |
| > | 大于 |
| =:= | 精确的等于 |
| =/= | 精确的不等于 |
如果要比较两个数,如果两个数之间是不同的类型,比如float和int那么,==操作会首先把两个数字转换成相同的相同类型。举例:
1> 1==1.0.
true
2> 1=:=1.0.
false
所以一般推荐用精确等于去比较
比较运算符的大小级别:
number < atom < reference < fun < port < pid < tuple < list < bit string
3> 1 > a.
false
| op | Description | Argument type |
| + | number | |
| - | number | |
| + | number | |
| - | number | |
| * | number | |
| / | 浮点数除法,结果是浮点数 | number |
| bnot | 一元not运算符 | integer |
| div | 整数除法,结果是整数 | integer |
| rem | 求玉树 | integer |
| band | and运算 | integer |
| bor | or运算 | integer |
| bxor | xor异或运算 | integer |
| bsl | 左移位操作 | integer |
| bsr | 右移位操作 | integer |
逻辑运算符
| op | Description |
| not | 一元逻辑not |
| and | 逻辑and |
| or | 逻辑or |
| xor | 逻辑xor |
此外,逻辑运算符还包括一个orelse 和andalso
原始的or和and是不带”短路运算”操作的,而orelse和andalso是带短路运算操作的。
短路运算举例
Express1 and Express2
Express1 andalso Express2
如果Express1 为假,and会继续判断Express2,然后整体判定为假,而andalso”短路”操作,直接判定整个表达式为假,从效率上来说,andalso会高一些
在Erlang的应用程序配置文件 .app 配置不正确的时候,Erlang应用程序启动有可能出现表面上启动正常,但是实际上没有正确启动的问题。
如果程序没有问题,但是启动后就是无法访问,可以考虑仔细检查一遍 .app 的配置信息,看看是不是多了或者少了一个 {},[]或者,

最新评论