Этот вопрос похож на 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
Я обвиняю вашу машину или установку. У меня никогда не было таких проблем на Debian или Ubuntu. –
@DirkEddelbuettel, я виню его, пытались заставить их обновиться в течение нескольких месяцев. Но застрял прямо сейчас, пытаясь найти обходное решение вместо этого. – cdeterman