Предупреждение 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 файл сделал свое дело!

Другие вопросы по тегам