自定义R查找共享对象的位置?

时间:2015-03-05 17:56:16

标签: r g++ rcpp centos5 g++4.8

这个问题类似于this previous question关于RcppArmadillo。

一些快速背景:

我目前必须在CentOS 5系统上工作。当然,CentOS 5附带的编译器太旧了,所以我们安装了gcc-4.8.3。现在,其他人担心与旧编译器的后兼容性,因此新的gcc被放置在opt目录中。为了使用升级的g ++,我必须使用LD_LIBRARY_PATH

在R中设置Sys.setenv
Sys.setenv(LD_LIBRARY_PATH = "/opt/gcc-4.8.3/rtf/lib:/opt/gcc-4.8.3/rtf/lib64")

现在,我还需要安装RcppArmadillo的存档版本。我从CRAN获取存档的包,并安装:

install.packages("RcppArmadillo_0.3.930.1.tar.gz", repose=NULL, type="source")

这似乎没有问题,但是当我尝试加载库时,我收到以下错误:

Error in dyn.load(file, DLLpath = DLLpath, ...) :
  unable to load shared object '/usr/lib64/R/library/RcppArmadillo/libs/RcppArmadillo.so':
  /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by /usr/lib64/R/library/RcppArmadillo/libs/RcppArmadillo.so)

据我所知,发现的libstdc++.so文件太旧了,即opt目录中没有的LD_LIBRARY_PATH文件。我认为这可以通过设置上面的/usr/lib64/来解决,但似乎仍然在查看so。有没有办法让R看到这个其他目录来获取相应的-shared文件?当然,如果我做了一些奇怪的事情会导致这种情况,我会接受其他解决方案(除了覆盖旧的gcc版本)。

修改

我还注意到,在安装后,usr/再次显示opt/路径,而不是opt路径。这是我想要更新的内容,因此R也会搜索* installing *source* package âRcppArmadilloâ ... ** package âRcppArmadilloâ successfully unpacked and MD5 sums checked * checking LAPACK_LIBS divide-and-conquer complex SVD unavailable via R-supplied LAPACK * divide-and-conquer algorithm for complex SVD will be redirected to default ** libs g++ -I/usr/include/R -DNDEBUG -I/usr/local/include -I"/usr/lib64/R/library/Rcpp/include" -I../inst/include -fpic -g -O3 -Wall -pipe -pedantic -Wno-variadic-macros -c RcppArmadillo.cpp -o RcppArmadillo.o g++ -I/usr/include/R -DNDEBUG -I/usr/local/include -I"/usr/lib64/R/library/Rcpp/include" -I../inst/include -fpic -g -O3 -Wall -pipe -pedantic -Wno-variadic-macros -c RcppExports.cpp -o RcppExports.o g++ -I/usr/include/R -DNDEBUG -I/usr/local/include -I"/usr/lib64/R/library/Rcpp/include" -I../inst/include -fpic -g -O3 -Wall -pipe -pedantic -Wno-variadic-macros -c fastLm.cpp -o fastLm.o g++ -shared -L/usr/local/lib64 -o RcppArmadillo.so RcppArmadillo.o RcppExports.o fastLm.o -L/usr/lib64/R/lib -lRlapack -L/usr/lib64/R/lib -lRblas -L/usr/bin/gfortran -L/usr/lib64/R/lib -lR 目录。

opt

更新

我还尝试通过设置Makevars .RPKG_LIBS += -L$(OPT_PATH)目录中创建OPT_PATH = /opt/gcc-4.8.3/rtf/lib64文件来手动追加shared目录。g++ -shared -L/usr/local/lib64 -o RcppArmadillo.so RcppArmadillo.o RcppExports.o fastLm.o -L/usr/lib64/R/lib -lRlapack -L/usr/lib64/R/lib -lRblas -L/usr/bin/gfortran -L/opt/gcc-4.8.3/rtf/lib64 -L/usr/lib64/R/lib -lR 编译期间的/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found 行如下所示:

ldd

但我仍然得到同样的错误:

RcppArmadillo.so

更奇怪的是(至少对我而言)是运行ldd /usr/lib64/R/library/RcppArmadillo/libs/RcppArmadillo.so ... libstdc++.so.6 => /opt/gcc-4.8.3/rtf/lib64/libstdc++.so.6 (0x00002ae950a3d000) ... 表明GLIBCXX_3.4.9文件指向正确的文件。

{{1}}

包含{{1}}

1 个答案:

答案 0 :(得分:3)

我最终找到了当前系统的解决方案。我需要与我们的IT部门协调以获得临时的sudo权限。然后,切换到root后我需要导出以下两个环境变量。

export LD_LIBRARY_PATH=/opt/gcc-4.8.3/rtf/lib:/opt/gcc-4.8.3/rtf/lib64
export LD_RUN_PATH=/opt/gcc-4.8.3/rtf/lib:/opt/gcc-4.8.3/rtf/lib64

然后,虽然仍然是root,我打开R并运行

install.packages('RcppArmadillo')

这在我们的CentOS 5.8系统上安装了最新的RcppArmadillo软件包,我们的gcc-4.8.3编译器位于opt的非标准位置。我通过切换到普通用户并成功加载包来验证安装是否有效。