我正在尝试在C中编写一个将由R调用的函数。在其中我需要从矢量中取代随机样本而不替换。 Rmath.h是否可以在R中使用类似sample()的东西?如果没有,有谁知道我为什么会得到
Symbol not found: _gsl_rng_mt19937
当我尝试使用dyn.load()调用包含(使用适当的标头)的代码时:
#include <gsl/gsl_randist.h>
#include <gsl/gsl_rng.h>
void update_infs (int *inds,
int *inf_times,
int *n,
int *n_inf,
int *locs,
int *Rinds,
double *logmean,
double *logsd,
double *alpha,
double *wts,
int *indices /* a vector 1:n */
) {
...
/* set up GSL RNG */
gsl_rng * rng = gsl_rng_alloc(gsl_rng_mt19937);
/* end of GSL setup */
...
gsl_ran_choose(rng, tmp_inf_me, Rinds[i], indices, *n, sizeof (double));
... }
答案 0 :(得分:5)
可能需要使用类似
的命令编译共享对象export PKG_CFLAGS=`gsl-config --cflags`
export PKG_LIBS=`gsl-config --libs`
然后
R CMD SHLIB gsl.c
或者
PKG_CFLAGS=`gsl-config --cflags` PKG_LIBS=`gsl-config --libs` R CMD SHLIB gsl.c
这告诉编译器在哪里查找头文件,以及链接器在何处查找要链接的库。在编译和链接期间,命令应包含gsl-config --cflags
和gsl-config --libs
的输出,沿着
gcc -std=gnu99 -I/home/mtmorgan/bin/R-devel/include -I/usr/local/include -I/usr/include -fpi -c gsl.c -o gsl.o
在compilatoin和
期间gcc -std=gnu99 -shared -L/usr/local/lib64 -o gsl.so gsl.o -L/usr/lib -lgsl -lgslcblas -lm -L/home/mtmorgan/bin/R-devel/lib -lR
链接期间。成功的考验是
R -e 'dyn.load("gsl.so")'
在一个软件包中,文件src/Makevars
带有
PKG_CFLAGS = `gsl-config --cflags`
PKG_LIBS = `gsl-config --libs`
并且,对于可能无法使用gsl-config
但用户已设法安装gsl并设置环境变量LIB_GSL
的Windows,文件src/Makevars.win
PKG_LIBS += -L$(LIB_GSL)$(R_ARCH)/lib -lgsl -lgslcblas -lm
PKG_CPPFLAGS += -I$(RHOME)/src/include -I$(LIB_GSL)$(R_ARCH)/include
答案 1 :(得分:0)
在忘记包含或共享库之前,我遇到过这种“未找到符号”错误 - 这两种错误在gsl中都是必需的,即gcc -I / usr / include / gsl foo.c -o foo -l:/usr/lib/libgsl.so
P.S。,R(sample()或一些外部库中的可用采样算法)是不是足够高效?令我感到惊讶的是,除了一些非常大的数据项目之外,这将是所有人的瓶颈......