0

我正在尝试编写使用 R 中的 BLAS lib 的 ac 函数(稍后将在 R 脚本中使用)

#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_'

我错过了什么?

4

4 回答 4

3

包含头文件与链接库不同。

我实际上对 R 一无所知,但我进行了一些搜索,发现http://cran.r-project.org/doc/manuals/R-exts.html#Creating-shared-objects这表明您需要 BLAS_LIBS变量 - 如果您不使用生成文件,看起来您可以获取命令“R CMD config BLAS_LIBS”的输出,然后在命令行中包含输出。您也可以将其添加到 PKG_LIBS 变量中,但我对 R 的了解还不够,无法确定。

编辑:

已将文件 Makevars.win 设置为包含

PKG_LIBS=$(BLAS_LIBS) 
PKG_LIBS=$(LAPAK_LIBS)

这将 PKG_LIBS 变量替换为 LAPAK_LIBS。尝试使用 += 而不是 =。

于 2011-04-04T22:23:51.620 回答
1

have set file Makevars.win to include

PKG_LIBS=$(BLAS_LIBS) 
PKG_LIBS=$(LAPAK_LIBS)

but error persists.

BINGO : added to

"R CMD SHLIB foo.c"

the output from

"R CMD config BLAS_LIBS"

as in

"R CMD SHLIB foo.c -LC:/PROGRA~1/R/R-212~1.2/bin/i386 -lRblas"

and now it works.

于 2011-04-04T23:34:05.813 回答
0

它在这里工作(请忽略我~/.R/Makevars选择了一个特定的CCand 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 是本地构建在静态库配置中的?

于 2011-04-04T22:28:11.090 回答
0

它需要链接到任何提供该dswap功能的东西。我猜那是在 R 库中。

于 2011-04-04T21:57:52.030 回答