Ubuntu ld找不到lRcpp

时间:2016-11-11 19:59:24

标签: ubuntu ld rcpp

我通过r-cran-rcpp安装了Rcpp,并使用dpkg -L r-cran-rcpp来查找

ls /usr/lib/R/site-library/Rcpp/libs/
Rcpp.so

但是当我使用ld -L /usr/lib/R/site-library/Rcpp/libs -l Rcpp ld抱怨它找不到Rcpp时,知道发生了什么事吗?

事实上,我正在使用Seamless R和C ++的第一个例子 与Rcpp集成,但以下代码抱怨找不到lrcpp

首先是fib.cpp中的cpp代码

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
int fibonacci(const int x) {

if (x == 0) return(0);

 if (x == 1) return(1);

return (fibonacci(x - 1)) + fibonacci(x - 2);

 }

extern "C" SEXP fibWrapper(SEXP xs) {

int x = Rcpp::as<int>(xs);

 int fib = fibonacci(x);

return (Rcpp::wrap(fib));

 }

〜然后我尝试编译它们

 PKG_CXXFLAGS="-I/home/sunxd/R/x86_64-pc-linux-gnu-library/3.3/Rcpp/include" \
 PKG_LIBS="-L/home/sunxd/R/x86_64-pc-linux-gnu-library/3.3/Rcpp/libs -lRcpp" \
R CMD SHLIB fib.cpp

PKG_CXXFLAGS="-I/usr/lib/R/site-library/Rcpp/include" \
 PKG_LIBS="-L/usr/lib/R/site-library/Rcpp/libs -lRcpp" \
R CMD SHLIB fib.cpp

1 个答案:

答案 0 :(得分:1)

好的,既然我们有一个完整的问题可以重现,我们可以解决这个问题:

  1. OP尝试重现2013年图书
  2. 中的介绍示例
  3. 当这本书出版时,我们仍然链接与Rcpp。
  4. 之后不再发生变化,我们现在使用的东西只包含标题并在加载时实例化(而非链接)
  5. 因此,链接步骤是多余的。
  6. 如果您将示例更新为空(或未设置)PKG_LIBS,那么一切都很好:
  7. 完整示例:

    /tmp$ cat fibonacci.cpp 
    
    #include <Rcpp.h>
    
    int fibonacci(const int x) {
       if (x == 0) return(0);
       if (x == 1) return(1);
       return (fibonacci(x - 1)) + fibonacci(x - 2);
    }
    
    extern "C" SEXP fibWrapper(SEXP xs) {
       int x = Rcpp::as<int>(xs);
       int fib = fibonacci(x);
       return (Rcpp::wrap(fib));
    }
    /tmp$ cat rcpp.sh
    #!/bin/sh
    PKG_CXXFLAGS="-I/usr/local/lib/R/site-library/Rcpp/include" \
    PKG_LIBS="" \
    R CMD SHLIB fibonacci.cpp
    /tmp$ ./rcpp.sh 
    g++ -I/usr/share/R/include -DNDEBUG     -I/usr/local/lib/R/site-library/Rcpp/include -fpic  -g -O3 -Wall -pipe -Wno-unused -pedantic -c fibonacci.cpp -o fibonacci.o
    g++ -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o fibonacci.so fibonacci.o -L/usr/lib/R/lib -lR
    /tmp$ 
    

    您现在可以加载fibonacci.so

    现在,Rcpp属性很多更好。看它的插图。