天天看點

Ubuntu 14.04 R上安裝rJava包出錯問題的解決: error: unable to load shared object (rJava.so)

啟動R後,在互動終端中執行 install.packages("rJava"),下載下傳rJava包編譯一會兒,報類似下面錯誤:

Error : .onLoad failed in loadNamespace() for 'rJava', details:

  call: dyn.load(file, DLLpath = DLLpath, ...)

  error: unable to load shared object '/home/hadoop/R/x86_64-pc-linux-gnu-library/3.0/rJava/libs/rJava.so':

  libjvm.so: cannot open shared object file:No such file or directory

Error: loading failed

Execution halted

ERROR: loading failed

* removing ‘/home/hadoop/R/x86_64-pc-linux-gnu-library/3.0/rJava’

* restoring previous ‘/home/hadoop/R/x86_64-pc-linux-gnu-library/3.0/rJava’

起初 ls -l /home/hadoop/R/x86_64-pc-linux-gnu-library/3.0/rJava/libs/rJava.so,沒有rJava.so沒編譯出來。

百度了一番,基本都是說$JAVA_HOME沒設或設定不對,再三确認,$JAVA_HOME是對的,指向環境中的jdk1.8, 并且通過

Sys.setenv(JAVA_HOME=‘/usr/lib/jvm/jdk1.8.0_131’), 也還是不行。 

繼續查日志,注意到編譯過程中-I引用的目錄不是java_home所指向的目錄,而是其它java版本的路徑(本機裝了多個JDK),如下: 

-I/usr/lib/jvm/java-1.7.0-openjdk-amd64/jre/../include -I/usr/lib/jvm/java-1.7.0-openjdk-amd64/jre/../include/linux

看來确實是環境變量和引用路徑的問題,繼續改配置:

~/.bashrc中增加: 

export JRE_HOME=$JAVA_HOME/jre

export CLASSPATH=$HIVE_HOME/lib:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH

這下編譯過了,rJava.so也出來了,并且是64bit的。

但是還有下面的錯:libjvm.so 找不到,導緻rJava 安裝後加載不了,rJava包還是沒通過。

libjvm.so: cannot open shared object file: No such file or directory

進$JAVA_HOME路徑中搜libjvm.so,确實是存在的,還是環境變量的問題? 繼續百度和嘗試,終于下面方面試通了,還有個變量要設:

export LD_LIBRARY_PATH=$JRE_HOME/lib/amd64/server:$JRE_HOME/lib/amd64/

好事多磨,終于看到了可愛的提示:

installing via 'install.libs.R' to /home/hadoop/R/x86_64-pc-linux-gnu-library/3.0/rJava

** R

** inst

** preparing package for lazy loading

** help

*** installing help indices

** building package indices

** testing if installed package can be loaded

* DONE (rJava)

The downloaded source packages are in

‘/tmp/RtmpOkzZDC/downloaded_packages’

回顧整個過程,總結起來有兩點:

1.各種問題和錯誤都有其原因,一定要有耐心,總能把它找出來并解決掉。

2.配置中的問題與環境相關性較大,最終發現兩個問題都是環境和環境變量設定的問題。回想以前環境JAVA配置過程中好像從來沒expo過這麼多變量,這次可能與本地安裝了多個JDK版本有關吧。

後記:指令行中輸入可檢視R環境中JAVA相關的設定,如下:

$  sudo R CMD  javareconf

Java interpreter : /usr/bin/java

Java version     : 1.8.0_131

Java home path   : /usr/lib/jvm/jdk1.8.0_131/jre

Java compiler    : /usr/bin/javac

Java headers gen.: /usr/bin/javah

Java archive tool: /usr/bin/jar

trying to compile and link a JNI progam 

detected JNI cpp flags    : -I$(JAVA_HOME)/../include -I$(JAVA_HOME)/../include/linux

detected JNI linker flags : -L$(JAVA_HOME)/lib/amd64/server -ljvm

gcc -std=gnu99 -I/usr/share/R/include -DNDEBUG -I/usr/lib/jvm/jdk1.8.0_131/jre/../include -I/usr/lib/jvm/jdk1.8.0_131/jre/../include/linux     -fpic  -O3 -pipe  -g  -c conftest.c -o conftest.o

gcc -std=gnu99 -shared -o conftest.so conftest.o -L/usr/lib/jvm/jdk1.8.0_131/jre/lib/amd64/server -ljvm -L/usr/lib/R/lib -lR

JAVA_HOME        : /usr/lib/jvm/jdk1.8.0_131/jre

Java library path: $(JAVA_HOME)/lib/amd64/server

JNI cpp flags    : -I$(JAVA_HOME)/../include -I$(JAVA_HOME)/../include/linux

JNI linker flags : -L$(JAVA_HOME)/lib/amd64/server -ljvm

Updating Java configuration in /usr/lib/R

Done.

繼續閱讀