2013-11-12 5 views
6

Это является продолжением до вопроса на Element-Wise Matrix Multiplication in RcppRcppArmadillo ошибки компиляции на OS X Mavericks

Я получал множество различных видов ошибок с RcppArmadillo после обновления Mavericks. У меня установлен Xcode 5.0.2 и средства командной строки. Кроме того, gfortran из Homebrew. Но я продолжаю встретив ошибку ниже -

> cppFunction("arma::mat schur(arma::mat& a, arma::mat& b) 
         { return(a % b); }", depends="RcppArmadillo") 


ld: library not found for -lgfortran 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
make: *** [sourceCpp_18474.so] Error 1 
clang++ -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I/usr/local/include - I"/Library/Frameworks/R.framework/Versions/3.0/Resources/library/Rcpp/include" -I"/Library/Frameworks/R.framework/Versions/3.0/Resources/library/RcppArmadillo/include" -fPIC "-mtune=native -g -O2 -Wall -pedantic -Wconversion" -c fileaf992bfb8f84.cpp -o fileaf992bfb8f84.o clang++ -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/usr/local/lib -L/usr/local/lib -o sourceCpp_18474.so fileaf992bfb8f84.o -L/Library/Frameworks/R.framework/Resources/lib -lRlapack -L/Library/Frameworks/R.framework/Resources/lib -lRblas -lgfortran /Library/Frameworks/R.framework/Versions/3.0/Resources/library/Rcpp/lib/libRcpp.a -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation 
Error in sourceCpp(code = code, env = env, rebuild = rebuild, showOutput = showOutput, : 
Error 1 occurred building shared library. 

WARNING: The tools required to build C++ code for R were not found. 

Please install Command Line Tools for XCode (or equivalent). 

# Contents of Makevars 
$ cat ~/.R/Makevars 
CC=clang 
CXX=clang++ 
CXXFLAGS="-mtune=native -g -O2 -Wall -pedantic -Wconversion" 
FLIBS=-lgfortran 

Комментируя FLIBS=-lgfortran не помогает и приводит к еще более сообщений об ошибках -

> cppFunction("arma::mat schur(arma::mat& a, arma::mat& b) { return(a % b); }", depends="RcppArmadillo") 
ld: warning: directory not found for option '-L/usr/local/lib/gcc/i686-apple-darwin8/4.2.3/x86_64' 
ld: warning: directory not found for option '-L/usr/local/lib/x86_64' 
ld: warning: directory not found for option '-L/usr/local/lib/gcc/i686-apple-darwin8/4.2.3' 
ld: library not found for -lgfortran 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
make: *** [sourceCpp_50381.so] Error 1 

Спасибо заранее.

Update

После предложения от ответа от Кевина и Dirk ниже, я заново установил Rcpp, RcppArmadillo и инлайн от источника и обновленного FLIBS, чтобы указать фактический каталог. Это решило проблему.

# 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 

ответ

10

EDIT: Если вы Homebrew пользователя, теперь вместо того, чтобы нужно не использовать brew install gcc (gfortran больше не предоставляется отдельное от gcc), а затем вы можете следовать инструкциям here, чтобы установить.


Вы должны симлинки библиотекам /usr/local/lib вручную:

ln -s /usr/local/Cellar/gfortran/4.8.2/gfortran/lib/libgfortran.* /usr/local/lib/

Я думал brew link gfortran бы справиться с этим, но, видимо, это только Символические ссылки программы gfortran, а не фактические библиотеки. Поэтому, к сожалению, вы должны сделать это сами.

(Заменить 4.8.2 с какой версией gfortran вы используете из homebrew.)


В качестве альтернативы, если вы хотите сохранить от изменения /usr/local/lib, вы можете использовать

FLIBS=-L/usr/local/Cellar/gfortran/4.8.2/gfortran 

в вашем ~/.R/Makevars файл, поэтому R знает, где найти библиотеки gfortran.

+0

Спасибо. Переустановить Rcpp, RcppArmadillo, встроенный источник и обновление FLIBS, чтобы указать на фактический каталог ('FLIBS = -L/usr/local/Cellar/gfortran/4.8.2/gfortran'), разрешили проблему. Для справки, для установки из источника - 'install.packages (c (" Rcpp "," RcppArmadillo "," inline "), type =" source ")' – xbsd

+1

Я столкнулся с аналогичной проблемой при установке Rserve в доморощенном R 3.1.2 на OS X Yosemite: 'ld: библиотека не найдена для -lintl'. Используя 'locate libintl.a', а затем добавив символическую ссылку из этого места в/usr/local/lib, как указано выше, проблема возникла. – coberlin

+0

'brew install gfortran' yeilds: GNU Fortran теперь предоставляется как часть GCC и может быть установлен с помощью: brew install gcc. Нужно ли мне вручную связывать gfortran после установки с помощью gcc? – Zach

1

Я могу только предложить вам изучить многочисленные темы на r-sig-mac list, различные ответы здесь на SO, а также сообщения на rcpp-devel list.

Поскольку ваша ошибка исходит из несоответствующей ссылки Fortran, возможно, также рассмотрим the standard page by Simon U., а также tools page. AFAIK вы должны использовать (более старый) gfortran 4.2. * С этой страницы с R - но тогда я не являюсь пользователем OS X.

Редактировать в конце 2016 года: Теперь у нас есть более подробные инструкции в section 2.16 of the Rcpp FAQ.

+1

Спасибо за ссылки, я последовал предложению по одному из вопросов в rcpp-devel-list и повторно установил Rcpp, RcppArmadillo и встроенный источник.Это решило проблему. – xbsd

+0

@Dirk Eddelbuettel. Если изучение многочисленных потоков на r-sig-mac используется usefeul: что они делают? Если на SO есть разные ответы, которые являются правильными? Что вы бы описали на странице "Simon U"? Что нужно сделать на странице инструментов? Если люди перешли с 2008 года, что они могут сделать в отношении поддержки fortran? – tim

Смежные вопросы