Category Archives: Erlang

[Erlang] Unable to load crypto library Windows下的解决办法

在一台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位的,一切正常~

Linux下Erlang中无法运行odbc:start()的解决办法

之前碰到过一次,但是当时是和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解决。

参考:《Linux(Debian)下正确编译安装Erlang的方法

Linux(Debian)下正确编译安装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源码编译安装的说明。另外如果有错或者缺少某些类库,还请指出,谢谢。

Erlang {“no such file or directory”,”crypto.app”} 的解决方法

 

一台新安装的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的类库并没有成功编译安装,这种情况下重新编译安装即可。

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
原子true 和false表示逻辑的”真”和”假”

此外,逻辑运算符还包括一个orelse 和andalso

原始的or和and是不带”短路运算”操作的,而orelse和andalso是带短路运算操作的。

短路运算举例

Express1 and Express2

Express1 andalso Express2

如果Express1 为假,and会继续判断Express2,然后整体判定为假,而andalso”短路”操作,直接判定整个表达式为假,从效率上来说,andalso会高一些

Erlang应用程序配置不正确导致不正常启动的问题

在Erlang的应用程序配置文件 .app 配置不正确的时候,Erlang应用程序启动有可能出现表面上启动正常,但是实际上没有正确启动的问题。

如果程序没有问题,但是启动后就是无法访问,可以考虑仔细检查一遍 .app 的配置信息,看看是不是多了或者少了一个 {},[]或者,