这个问题在RcppArmadillo方面类似于RcppArmadillo。
一些简短的背景:
我目前必须使用CentOS 5系统。当然,CentOS 5附带的编译器太老了,所以我们安装了gcc-4.8.3。现在,其他人关心的是与旧编译器的反向兼容性,因此新的gcc被放在opt目录中。为了使用升级的g++,我必须用Sys.setenv在R中设置Sys.setenv
Sys.setenv(LD_LIBRARY_PATH = "/opt/gcc-4.8.3/rtf/lib:/opt/gcc-4.8.3/rtf/lib64")现在,我还需要安装一个存档版本的RcppArmadillo。我从克拉恩获得存档包,并通过以下方式安装:
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/。有没有办法让R查看另一个目录以获得适当的so文件?当然,如果我做了什么奇怪的事情会导致这一点,我愿意接受其他的解决方案(除了覆盖旧的gcc版本)。
编辑
我还注意到,在安装时,-shared再次显示usr/路径,而不是opt/路径。这就是我想要更新的内容,这样R也会搜索opt目录。
* 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目录,方法是在.R目录中创建一个Makevars文件,方法是设置PKG_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的
发布于 2015-03-12 12:18:22
我最终用目前的系统找到了一个解决方案。我需要与我们的IT部门协调,以获得临时的sudo特权。然后,在切换到根之后,我需要导出以下两个环境变量。
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然后,当我仍然作为根,我打开R和运行
install.packages('RcppArmadillo')这在我们的RcppArmadillo 5.8系统上安装了最新的CentOS软件包,我们的gcc-4.8.3编译器在opt中的非标准位置。我通过切换到普通用户并成功加载包来验证安装工作。
https://stackoverflow.com/questions/28884514
复制相似问题