我的想法
我正在尝试为R创建一个库,但我无法加载它。
我得到的错误是
Error in dyn.load(file, DLLpath = DLLpath, ...) :
unable to load shared object '/home/stenver/R/x86_64-pc-linux-gnu- library/2.15/RcppWilcoxonTest/libs/RcppWilcoxonTest.so':
/home/stenver/R/x86_64-pc-linux-gnu-library/2.15/RcppWilcoxonTest/libs/RcppWilcoxonTest.so: undefined symbol: gsl_cdf_gaussian_Q
Error: loading failed
我的Makevars文件如下所示:
PKG_LIBS = `$(R_HOME)/bin/Rscript -e "Rcpp:::LdFlags()" `
我试过改变那里的各种东西。
我的NAMESPACE文件如下所示:
useDynLib(RcppWilcoxonTest)
useDynLib(gsl)
useDynLib(WilcoxonTest)
import(Rcpp)
export(RcppWilcoxonTest)
失败发生在我尝试使用的动态共享库中。我已将动态库文件复制到src文件夹,因此R会自行编译它们,但它没用。理想情况下,我想将库和Rcpp接口实现保存在单独的文件夹中。
在某些时候,我也尝试使用RcppGSL,但它没有帮助,因为R在安装后无法找到包。
可以在这里看到整个存储库:
在RcppWilcoxonTest文件夹中
答案 0 :(得分:3)
您需要src/Makevars
文件中的以下内容;那是(借用RcppGSL
做事的方式):
PKG_LIBS = `$(R_HOME)/bin/Rscript -e "Rcpp:::LdFlags()"` `gsl-config --libs`
所以R知道在编译包时需要链接GSL。有关详细信息,请参阅R-exts。
通过检查RcppGSL
如何配置以查找GSL,并在包中使用类似的方法,您可以学到很多东西。
答案 1 :(得分:3)
凯文的回答可能会对你有所帮助,但实际上有一个CRAN包明确依赖于RcppGSL,其中我做了
edd@max:~/git/rcppziggurat/src$ cat Makevars
PKG_CPPFLAGS = -I. -I../inst/include
## Use the R_HOME indirection to support installations of multiple R version
PKG_LIBS = `$(R_HOME)/bin/Rscript -e "Rcpp:::LdFlags()"` \
`$(R_HOME)/bin/Rscript -e "RcppGSL:::LdFlags()"`
edd@max:~/git/rcppziggurat/src$
我在这里为显示包裹了一行。
实质上,RcppGSL会调用Kevin提到的gsl-config
。