ОШИБКА компиляции Rcpp: 'clang: ошибка: нет такого файла или каталога: '/usr/local/lib/libfontconfig.a'

Я пытался запустить этот мир кода в R (кредит автора):

require(Rcpp)
require(RcppArmadillo)
require(inline)
cosineRcpp <- cxxfunction( 
  signature(Xs = "matrix"), 
  plugin = c("RcppArmadillo"),
  body='
    Rcpp::NumericMatrix Xr(Xs);  // creates Rcpp matrix from SEXP
    int n = Xr.nrow(), k = Xr.ncol();
    arma::mat X(Xr.begin(), n, k, false); // reuses memory and avoids extra copy
    arma::mat Y = arma::trans(X) * X; // matrix product
    arma::mat res = (1 - Y / (arma::sqrt(arma::diagvec(Y)) * arma::trans(arma::sqrt(arma::diagvec(Y)))));
    return Rcpp::wrap(res);
')

И получил, после нескольких исправлений, следующую ошибку:

Error in compileCode(f, code, language = language, verbose = verbose) : 
  Compilation ERROR, function(s)/method(s) not created! 
clang: error: no such file or directory: '/usr/local/lib/libfontconfig.a'
clang: error: no such file or directory: '/usr/local/lib/libreadline.a'
make: *** [file5a681e35ebe1.so] Error 1
In addition: Warning message:
running command '/Library/Frameworks/R.framework/Resources/bin/R CMD SHLIB file5a681e35ebe1.cpp 2> file5a681e35ebe1.cpp.err.txt' had status 1 

Раньше я часто использовал Rcpp. Но с тех пор мой компьютер переформатировался, и все установки выполнялись с использованием homebrew.

Я установил cairo с заваркой: brew install cairo

libreadline.a ошибка была решена с помощью:

brew link --force readline

Но то же самое не работает для libfontconfig.a так как уже было связано:

brew link --force fontconfig
Warning: Already linked: /usr/local/Cellar/fontconfig/2.11.1
To relink: brew unlink fontconfig && brew link fontconfig

Я бы предположил, что fontconfig внутри cairo, На самом деле, когда я печатаю

brew install fontconfig
Warning: fontconfig-2.11.1 already installed

Но правда в том, что нет libfontconfig.a в /usr/local/lib/:

ls /usr/local/lib/libfont*
/usr/local/lib/libfontconfig.1.dylib 
/usr/local/lib/libfontconfig.dylib

Используя весьма сомнительный подход, чтобы перейти сюда и загрузить его, код запускается, но все равно выдает соответствующее предупреждение, поскольку файл соответствует другой архитектуре os.x (я не нашел такую ​​для 10.9):

+ . + ld: warning: ignoring file /usr/local/lib/libfontconfig.a, missing required architecture x86_64 in file /usr/local/lib/libfontconfig.a (2 slices)

Так что на этом этапе я немного растерялся.

Как мне установить libfontconfig.a или найти версию 10.9?

В случае какой-либо пользы, у меня установлен Xcode, я нахожусь на Mac 10.9.5, и на основании этого очень хорошего и подробного ответа мой ~/.R/Makevars файл выглядит так:

CC=clang
CXX=clang++
FLIBS=-L/usr/local/bin/

1 ответ

Решение

Настройка вашей системы нарушена. Ни R, ни Rcpp не имеют ничего общего с clang (если вы не выбрали clang в качестве системного компилятора) или fontconfig.

Так что начнем проще:

R> library(Rcpp)
R> evalCpp("2 + 2")
[1] 4
R>

Это только показало, что в моей системе есть работающий компилятор R (и Rcpp), с которым можно общаться. Мы можем это более явно:

R> evalCpp("2 + 2", verbose=TRUE)

Generated code for function definition: 
--------------------------------------------------------

#include <Rcpp.h>

using namespace Rcpp;

// [[Rcpp::export]]
SEXP get_value(){ return wrap( 2 + 2 ) ; }

No rebuild required (use rebuild = TRUE to force a rebuild)

[1] 4
R>

и R достаточно умен, чтобы не восстанавливать. Затем мы можем форсировать

R> evalCpp("2 + 2", verbose=TRUE, rebuild=TRUE)

Generated code for function definition: 
--------------------------------------------------------

#include <Rcpp.h>

using namespace Rcpp;

// [[Rcpp::export]]
SEXP get_value(){ return wrap( 2 + 2 ) ; }

Generated extern "C" functions 
--------------------------------------------------------


#include <Rcpp.h>
// get_value
SEXP get_value();
RcppExport SEXP sourceCpp_0_get_value() {
BEGIN_RCPP
    Rcpp::RObject __result;
    Rcpp::RNGScope __rngScope;
    __result = Rcpp::wrap(get_value());
    return __result;
END_RCPP
}

Generated R functions 
-------------------------------------------------------

`.sourceCpp_0_DLLInfo` <- dyn.load('/tmp/Rtmpeuaiu4/sourcecpp_6a7c7c8295fc/sourceCpp_2.so')

get_value <- Rcpp:::sourceCppFunction(function() {}, FALSE, `.sourceCpp_0_DLLInfo`, 'sourceCpp_0_get_value')

rm(`.sourceCpp_0_DLLInfo`)

Building shared library
--------------------------------------------------------

DIR: /tmp/Rtmpeuaiu4/sourcecpp_6a7c7c8295fc

/usr/lib/R/bin/R CMD SHLIB -o 'sourceCpp_2.so' --preclean  'file6a7c6d1fc2d6.cpp'  
ccache g++ -I/usr/share/R/include -DNDEBUG    -I"/usr/local/lib/R/site-library/Rcpp/include" -I"/tmp/Rtmpeuaiu4"    -fpic  -g -O3 -Wall -pipe -Wno-unused -pedantic -c file6a7c6d1fc2d6.cpp -o file6a7c6d1fc2d6.o
g++ -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o sourceCpp_2.so file6a7c6d1fc2d6.o -L/usr/lib/R/lib -lR
[1] 4
R> 

и на этом вы видите системные детали на моей стороне (Linux, также использующие ccache), которые будут отличаться для вас.

После этого попробуйте (Rcpp)Armadillo one-liners и так далее.

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