我正在尝试编写一个c函数(稍后将在R脚本中使用),该函数使用R中的BLAS lib
#include <stdio.h>
#include <R.h>
#include <R_ext/BLAS.h>
void foo(int *dimension, double *vect1, double *vect2)
{
const int dim = dimension[0];
const int incxy = 1;
//swaps two vectors
F77_NAME(dswap)(&dim,vect1,&incxy,vect2,&incxy);
}
我使用以下方法编译代码:
R CMD SHLIB foo.c
我收到错误:
foo.o:foo.c:(.text+0x41): undefined reference to `dswap_'
我错过了什么?
包含头文件与链接库不同。
我实际上对 R 一无所知,但我做了一些搜索并找到了 http://cran.r-project.org/doc/manuals/R-exts.html#Creating-shared-objects 表明您需要 BLAS_LIBS 变量 - 如果您不使用 makefile,看起来您可以获取命令"R CMD config BLAS_LIBS"的输出,然后将输出包含在命令行上。您也可以将其添加到PKG_LIBS变量中,但我对 R 的了解还不够多,无法确定。
编辑:
已设置文件 Makevars.win 以包含
PKG_LIBS=$(BLAS_LIBS)
PKG_LIBS=$(LAPAK_LIBS)
这会将PKG_LIBS变量替换为 LAPAK_LIBS。尝试使用 += 而不是 =。
有设置文件Makevars.win将包括
PKG_LIBS=$(BLAS_LIBS)
PKG_LIBS=$(LAPAK_LIBS)
但错误仍然存在。
宾果 : 添加到
"R CMD SHLIB foo.c"
输出自
"R CMD config BLAS_LIBS"
如
"R CMD SHLIB foo.c -LC:/PROGRA~1/R/R-212~1.2/bin/i386 -lRblas"
现在它起作用了。
它需要链接到提供dswap
函数的任何内容。 我猜那是在 R 库中。
它在这里工作(请忽略我的~/.R/Makevars
选择特定的CC
和CFLAGS
;并且还忽略较小的空格编辑):
edd@max:/tmp$ R CMD SHLIB foo.c
gcc-4.5 -I/usr/share/R/include -fpic -O3 -g0 -Wall -pipe -pedantic -std=gnu99
-c foo.c -o foo.o
gcc -shared -o foo.so foo.o -L/usr/lib64/R/lib -lR
edd@max:/tmp$ cat foo.c
#include <stdio.h>
#include <R.h>
#include <R_ext/BLAS.h>
void foo(int *dimension, double *vect1, double *vect2)
{
const int dim = dimension[0];
const int incxy = 1;
//swaps two vectors
F77_NAME(dswap)(&dim,vect1,&incxy,vect2,&incxy);
}
edd@max:/tmp$
Ubuntu 10.10,R,gcc等的库存软件包。 也许您的 R 是在静态库配置中本地构建的?