Erlang安裝時加載openssl的libcrypto.a失敗,執行crypto:start()報錯的解決方案

剛開始碰到這個問題的時候,從網上找的例子。搞了半天很差使,後來發現了緣由,主因是本身對linux認知不夠,只有發佈服務、查看日誌的基本功。linux

先上原文鏈接:http://blog.csdn.net/zhongruixian/article/details/21076405shell

而後再講本身操做失敗的緣由,主要是爲了給本身作下記錄。vim

 

錯誤信息:centos

[plain] view plain copy 在CODE上查看代碼片派生到個人代碼片app

  1. Eshell V5.10.3  (abort with ^G)  
  2. 1> crypto:start().  
  3. ** exception error: undefined function crypto:start/0  
  4. 2>  
  5. =ERROR REPORT==== 12-Mar-2014::17:09:15 ===  
  6. Unable to load crypto library. Failed with error:  
  7. "load_failed, Failed to load NIF library: '/usr/local/lib/erlang/lib/crypto-3.1/priv/lib/crypto.so: undefined symbol: EC_GROUP_new_curve_GF2m'"  
  8. OpenSSL might not be installed on this system.  
  9.   
  10.   
  11. =ERROR REPORT==== 12-Mar-2014::17:09:15 ===  
  12. The on_load function for module crypto returned {error,  
  13.                                                  {load_failed,  
  14.                                                   "Failed to load NIF library: '/usr/local/lib/erlang/lib/crypto-3.1/priv/lib/crypto.so: undefined symbol: EC_GROUP_new_curve_GF2m'"}}  

 

 

解決辦法:ui

 

一、下載openssl源碼this

    wget http://www.openssl.org/source/openssl-1.0.1f.tar.gz
    tar zxvf openssl-1.0.1f.tar.gz.net

二、進入源碼目錄,若是不是新下載解壓的目錄,並且之前有編譯安裝過的,進入目錄後執行make clean以確保能從新編譯日誌

    cd openssl-1.0.1fcode

三、爲了避免要和已安裝的openssl混淆,這裏指定一個新的安裝目錄

    ./config --prefix=/opt/ssl 

四、config以後,會生成Makefile,打開Makefile找到gcc,在CFLAG參數列表里加上-fPIC

    vim Makefile

 

[cpp] view plain copy 在CODE上查看代碼片派生到個人代碼片

  1. CC= gcc    
  2. CFLAG= -fPIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -Wa,--noexecstack -m64 -DL_ENDIAN -DTERMIO -O3 -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM   

 

 

五、編譯並安裝

 

    make && make install

六、如今進入你的erlang源碼安裝目錄,若是已經編譯安裝過erlang,爲確保能從新編譯,先執行:

    make clean

七、加上openssl安裝路徑從新configure,若是有安裝多個版本的erlang,爲了能夠方便找到新安裝的erl,這裏能夠指定一個新的安裝目錄,示例以下:

    ./configure --with-ssl=/opt/ssl/ --prefix=/opt/erlang

八、編譯並安裝

    make && make install

九、運行剛纔安裝的erlang

    /opt/erlang/bin/erl

[plain] view plain copy 在CODE上查看代碼片派生到個人代碼片

  1. Eshell V5.10.3  (abort with ^G)  
  2. 1> crypto:start().  
  3. ok  
  4. 2>  


 

十、小結

不少同窗根據我上一篇文章重裝後仍然失敗的緣由,常見的有以下幾個:

一、加-fPIC參數重裝openssl後,不明確新編譯出來的靜態庫libcrypto.a在哪裏,若是之前有安裝過的,不明確是否被覆蓋;
二、對於已經編譯安裝過的源碼目錄,沒有執行make clean;
二、重裝erlang時,沒有具體指定最新安裝的ssl目錄;
三、重裝erlang後,直接執行erl時,仍然執行了老的erl,能夠加上完整路徑執行erl嘗試,用whereis erl查看一下默認執行路徑。

 

 

 

本人操做時就蠢在了第三個緣由上面。先是進入了指定的erlang安裝目錄,可是,可是,進入目錄後直接運行了erl 命令,而不是 ./erl ,飲恨此處。

解決方法: 

一、whereis erl    找到erl的運行路徑:/usr/local/bin/erl(centos)

二、vi /usr/local/bin/erl(erl命令路徑文件)

    修改:ROOTDIR="/app/erlang/lib/erlang"     切記修改ROOTDIR指定的路徑。  就算修改了/etc/profile也很差使,切記修改此處。

 

這個問題找了半天,終究緣由是本身對linux認知不夠,這種問題以前根本不會的。

相關文章
相關標籤/搜索