我该如何修复此c代码/ BLAS错误?

时间:2011-04-04 21:55:42

标签: c r blas

我正在尝试编写一个c函数(稍后将在R脚本中使用),它使用来自R的BLAS库

#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 个答案:

答案 0 :(得分:3)

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

我实际上对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)

用LAPAK_LIBS替换 PKG_LIBS变量。尝试用+ =代替=。

答案 1 :(得分:1)

已设置文件 Makevars.win包括

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

但错误仍然存​​在。

BINGO:加入

"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"

现在可行。

答案 2 :(得分:0)

它需要链接到提供dswap功能的任何内容。我猜这是在R库中。

答案 3 :(得分:0)

它可以在这里工作(请忽略我的~/.R/Makevars选择特定的CCCFLAGS;还要忽略次要的空格编辑):

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是在静态库配置中本地构建的?