【问题标题】:Rcpp Compilation ERROR: 'clang: error: no such file or directory: '/usr/local/lib/libfontconfig.a'Rcpp 编译错误:'clang:错误:没有这样的文件或目录:'/usr/local/lib/libfontconfig.a'
【发布时间】:2016-06-08 14:10:44
【问题描述】:

我试图在 R 中运行这种和平的代码(感谢 the author):

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。但是从现在到现在,我的计算机已经重新格式化,并且所有安装都使用自制软件重新完成。

我用 brew 安装了cairobrew 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

我会假设fontconfigcairo 内。事实上,当我输入

brew install fontconfig
Warning: fontconfig-2.11.1 already installed

但事实是/usr/local/lib/ 上没有libfontconfig.a

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

使用非常可疑的方法去here并下载它,代码运行,但仍然给出相应的警告,因为该文件对应于不同的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 上, 并基于this 非常好的和详细的答案,我的~/.R/Makevars 文件看起来像:

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

【问题讨论】:

标签: r rcpp libconfig


【解决方案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 等等。

【讨论】:

  • 你写的所有东西都在我的系统上运行得很好。也许我应该从删除 ~/.R/Makevars 中的 CC=clang 、 CXX=clang++ 开始(默认情况下在那里,因为我从未输入过它。无论如何,谢谢(一如既往),谢天谢地,Rcpp 现在运行得和往常一样快和好. (不过,如果我删除 simlink 到 readline 或 libfontconfig.a 文件,它将无法工作,但是....我将让它暂时运行)
  • 另外,我从这里读到以下内容:r-pkgs.had.co.nz/src.html#make:“使用 clang 而不是 gcc 来编译你的 C++ 代码:它提供了更好的错误消息。你可以通过创建一个 . R/Makevars (linux 和 mac) 或 .R/Makevars.win (windows) 文件位于您的主目录中,其中包含:CXX=clang++"。这就是为什么我首先假设clang与Rcpp有关:)。
  • Wickham 博士非常不幸地倾向于发表听起来好像普遍正确的陈述。由于这个提议似乎破坏了你的系统,我建议你向他投诉。我们没有提出这样的建议(但参考 clang 作为 OS X 上一种可能的编译器)。
  • 另外,R 不会创建~/.R/Makevars,所以你一定是在某个时候复制了它。有时,我们都会为这些互联网上所说的话而堕落……
  • :) !!好的,德克,那么,你有什么建议?您在回复中写的所有内容都很好,目前我尝试过的所有 Rcpp 代码都在运行(不仅是我的问题中显示的那个)。但是,当然,我宁愿拥有一个“未损坏”的 R 系统。因此,您可能建议我很乐意尝试的任何内容,我的意思是,您编写了包,所以...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
  • 1970-01-01
相关资源
最近更新 更多