我通过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
答案 0 :(得分:1)
好的,既然我们有一个完整的问题可以重现,我们可以解决这个问题:
PKG_LIBS
,那么一切都很好:完整示例:
/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属性很多更好。看它的插图。