2015-03-05 3 views
2

Этот вопрос похож на this previous question относительно RcppArmadillo.Настроить, где R ищет общие объекты?

быстрой контекст:

В настоящее время я должен работать на системе CentOS 5. Естественно, что компилятор, который поставляется с CentOS 5, был слишком старым, поэтому мы установили gcc-4.8.3. Теперь другие были обеспокоены обратной совместимостью со старым компилятором, поэтому новый gcc был помещен в каталог opt. Для того, чтобы использовать модернизированную г ++ я должен установить 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/. Есть ли какой-нибудь способ, чтобы я мог найти R в этом другом каталоге, чтобы получить соответствующий файл so? Естественно, если бы я сделал что-то странное, что вызвало бы это, я был бы открыт для других решений (помимо перезаписи старой версии gcc).

EDIT

Я также заметил, что при монтаже -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 

UPDATE

Я также попытался вручную прилагая каталог opt, создав Makevars файл в каталоге .R путем установки 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

+0

Я обвиняю вашу машину или установку. У меня никогда не было таких проблем на Debian или Ubuntu. –

+0

@DirkEddelbuettel, я виню его, пытались заставить их обновиться в течение нескольких месяцев. Но застрял прямо сейчас, пытаясь найти обходное решение вместо этого. – cdeterman

ответ

3

я в конце концов пришел к решению с существующей системой. Мне нужно было координировать работу с нашим ИТ-отделом, чтобы получить временные привилегии 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 

Затем, в то же время, как корень, я открыл R и побежал

install.packages('RcppArmadillo') 

Это установлен последний пакет RcppArmadillo в нашей системе CentOS 5.8 с нашим GCC-4.8.3 компилятором в его нестандартности место в opt. Я проверил установку, переключившись на обычного пользователя и успешно загрузив пакет.