Предупреждение Rcpp: "каталог не найден для опции '-L/usr/local/Cellar/gfortran/4.8.2/gfortran'"
Этот вопрос касается некоторых других, таких как RccpArmadillo или поэлементное умножение.
Тем не менее, мои настройки таковы, что я не знаю, что мне нужно отредактировать /simlink, чтобы запустить Rccp без предупреждения.
Я на Mac 10.9 (Mavericks), используя последнюю версию R.
В самом начале, пробуя следующий код, который я получил отсюда RccpvsR, я получил ошибку:
ld: library not found for -lgfortran
clang: error: linker command failed with exit code 1 (use -v to see invocation)`
Затем на основе RccpArmadillo я сделал следующее:
# Update FLIBS in ~/.R/Makevars
FLIBS=-L/usr/local/Cellar/gfortran/4.8.2/gfortran
#Re-Install from source
install.packages(c("Rcpp","RcppArmadillo","inline"),type="source")
#Restart R
это было просто пробовать, потому что у меня нет /usr/local/Cellar/gfortran/
каталог. На самом деле все мои libgfortran*
файлы здесь (в директории macports):
>ls /opt/local/lib/gcc48/libgfortran.*
/opt/local/lib/gcc48/libgfortran.3.dylib /opt/local/lib/gcc48/libgfortran.dylib
/opt/local/lib/gcc48/libgfortran.a /opt/local/lib/gcc48/libgfortran.spec
и здесь /opt/local/lib/gcc48/gcc/x86_64-apple-darwin13/4.8.3/libgfortranbegin.a
а у меня нет gfortran
файл в любом месте.
Затем я снова попробовал код RccpvsR, и на удивление, он сработал! Помимо того, что я получаю предупреждение:
ld: warning: directory not found for option '-L/usr/local/Cellar/gfortran/4.8.2/gfortran'
потому что, конечно, он не существует, но функция, созданная этим кодом, cosineRcpp
, работает без проблем.
Поэтому все это, чтобы спросить, если кто-нибудь знает, если я должен simlink libgfortran
файлы в /opt/local/lib/gcc48/
как:
ln -s /opt/local/lib/gcc48/libgfortran.* /usr/local/lib/
а затем удалите / отредактируйте строку:
FLIBS=-L/usr/local/Cellar/gfortran/4.8.2/gfortran
в ~/.R/Makevars
или если я должен установить что-то новое.
Спасибо заранее за ваше время!
2 ответа
Короткий ответ
Просто проложите путь к libgfortran
в FLIBS
например,
FLIBS=-L/opt/local/lib/gcc48/
Или символическую ссылку на файлы в /usr/local/lib/
Если вам это удобно. Это решение, однако, довольно хрупкое, так как легко забыть обновить этот путь, если вы обновите gfortran
или переместите его в другой каталог.
Чуть более длинный ответ
Вы можете запросить gfortran
для пути к libgfortran.dylib
как например
gfortran -print-file-name=libgfortran.dylib
Вы можете просто выполнить это прямо в вашем Makevars
файл; например
FLIBS = -L`gfortran -print-file-name=libgfortran.dylib | xargs dirname`
Устаревший длинный ответ
Попробуйте разобрать подходящий FLIBS
прямо из gfortran
выход.
Сначала немного предыстории. /usr/local/Cellar
каталог - это путь по умолчанию, используемый homebrew, менеджером пакетов для OS X. Думайте об этом как об альтернативе macports
,
Доморощенный теперь обеспечивает gfortran
и связанные с ним библиотеки как часть gcc
пакет, и поэтому пути, по которым он устанавливает библиотеки FORTRAN, теперь изменились. Тем не менее, они могут (в целом) быть обнаружены с помощью gfortran -print-search-dirs
, Например, в моей системе
gfortran -print-search-dirs
даст мне
install: /usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/
programs: =/usr/local/Cellar/gcc/4.9.2_1/libexec/gcc/x86_64-apple-darwin14.0.0/4.9.2/:/usr/local/Cellar/gcc/4.9.2_1/libexec/gcc/x86_64-apple-darwin14.0.0/4.9.2/:/usr/local/Cellar/gcc/4.9.2_1/libexec/gcc/x86_64-apple-darwin14.0.0/:/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/:/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/:/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../../../../x86_64-apple-darwin14.0.0/bin/x86_64-apple-darwin14.0.0/4.9.2/:/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../../../../x86_64-apple-darwin14.0.0/bin/
libraries: =/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/:/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../../../../x86_64-apple-darwin14.0.0/lib/x86_64-apple-darwin14.0.0/4.9.2/:/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../../../../x86_64-apple-darwin14.0.0/lib/:/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../x86_64-apple-darwin14.0.0/4.9.2/:/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../:/lib/x86_64-apple-darwin14.0.0/4.9.2/:/lib/:/usr/lib/x86_64-apple-darwin14.0.0/4.9.2/:/usr/lib/
Разделив и напечатав R, я вижу:
[[1]]
[1] "/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/"
[[2]]
[1] "/usr/local/Cellar/gcc/4.9.2_1/libexec/gcc/x86_64-apple-darwin14.0.0/4.9.2/"
[2] "/usr/local/Cellar/gcc/4.9.2_1/libexec/gcc/x86_64-apple-darwin14.0.0/4.9.2/"
[3] "/usr/local/Cellar/gcc/4.9.2_1/libexec/gcc/x86_64-apple-darwin14.0.0/"
[4] "/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/"
[5] "/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/"
[6] "/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../../../../x86_64-apple-darwin14.0.0/bin/x86_64-apple-darwin14.0.0/4.9.2/"
[7] "/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../../../../x86_64-apple-darwin14.0.0/bin/"
[[3]]
[1] "/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/"
[2] "/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../../../../x86_64-apple-darwin14.0.0/lib/x86_64-apple-darwin14.0.0/4.9.2/"
[3] "/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../../../../x86_64-apple-darwin14.0.0/lib/"
[4] "/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../x86_64-apple-darwin14.0.0/4.9.2/"
[5] "/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../"
[6] "/lib/x86_64-apple-darwin14.0.0/4.9.2/"
[7] "/lib/"
[8] "/usr/lib/x86_64-apple-darwin14.0.0/4.9.2/"
[9] "/usr/lib/"
В моем случае, libgfortran
на самом деле живет здесь:
/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../
И вот этот путь мы хотим пройти FLIBS
, Но вытащить это - своего рода боль, так что давайте просто скажем FLIBS
использовать любые пути, которые обычно используются gfortran
:
gfortran -print-search-dirs | grep ^libraries: | sed 's|libraries: =||'
Это хорошо, но мы хотим, чтобы пути к библиотекам были в формате, подходящем для компилятора; то есть с -L
предваряется. Давайте сделаем это с sed
:
gfortran -print-search-dirs | grep ^libraries: | sed 's|libraries: =||' | sed 's|:| -L|g' | sed 's|^|-L|'
Это выходные данные (разделены для удобства чтения)
-L/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/
-L/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../../../../x86_64-apple-darwin14.0.0/lib/x86_64-apple-darwin14.0.0/4.9.2/
-L/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../../../../x86_64-apple-darwin14.0.0/lib/
-L/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../x86_64-apple-darwin14.0.0/4.9.2/
-L/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/gcc/x86_64-apple-darwin14.0.0/4.9.2/../../../
-L/lib/x86_64-apple-darwin14.0.0/4.9.2/
-L/lib/
-L/usr/lib/x86_64-apple-darwin14.0.0/4.9.2/
-L/usr/lib/
Все вместе это означает, что следующее должно работать для вас, по крайней мере, на OS X, но должно (в общем) работать на любой платформе с gfortran
(пока это на PATH
):
FLIBS=`gfortran -print-search-dirs | grep ^libraries: | sed 's|libraries: =||' | sed 's|:| -L|g' | sed 's|^|-L|'`
Это не идеально, например, оно потерпит неудачу, если у вас есть пробелы на ваших путях - если вы это сделаете, 1) вы заслуживаете того, что получаете, и 2) это также должно быть "относительно" простым исправлением.
Небольшой твик к ответу от @kevin-ushey (который по крайней мере мне был нужен; я использую Prezto) добавлял одинарные кавычки в grep '^libraries:'
, в результате чего:
FLIBS=`gfortran -print-search-dirs | grep '^libraries:' | sed 's|libraries: =||' | sed 's|:| -L|g' | sed 's|^|-L|'`
Добавление этой строки в мой ~/.R/Makevars
файл сделал свое дело!