我该如何解决这个c代码/ BLAS错误?

问题描述:

我想写一个使用BLAS LIB来自R我该如何解决这个c代码/ 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中脚本中使用),我编译使用的代码:

R CMD SHLIB foo.c 

我得到的错误:

foo.o:foo.c:(.text+0x41): undefined reference to `dswap_' 

我在想什么?

它需要链接到任何提供dswap函数。我想这是在R库中。

+0

R_ext/BLAS.h是dswap的头文件 – cfort 2011-04-04 22:10:37

+0

@ user605507:包含头与链接库不同。 – 2011-04-04 22:31:00

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

我实际上并不知道有关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变量。试用+ =而不是=。

+0

您的观点通常是真实的,但是对于R,libR.so共享库通常与libblas链接,因此BLAS符号应该可见。查看我的答案以获得工作演示。 – 2011-04-04 22:34:11

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

[email protected]:/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 
[email protected]:/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); 
} 
[email protected]:/tmp$ 

的Ubuntu 10.10,股票包R,GCC等也许你的[R是在静态库配置中本地构建的?

+0

我在Windows上编码。这可能是原因吗? – cfort 2011-04-04 23:06:16

+0

也许吧。您可以尝试更加明确 - 相应地尝试设置PKG_LIBS,或者通过复制R CMD SHLIBS显示的命令并根据需要添加-L和-l开关来实验。 – 2011-04-04 23:10:17

已设置文件 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" 

,现在它的工作原理。

+1

不要添加aswer,而要编辑自己的问题。另外,你想''PKG_LIB + = ...'作为'='简单覆盖。 – 2011-04-05 00:06:28

+0

从'[Writing R Extensions](http://cran.r-project.org/doc/manuals/R-exts.html)'1.2节,而不是添加到命令行中,添加一个文件Makevars与'PKG_LIBS + = $(BLAS_LIBS)$(LAPACK_LIBS)'。 – 2011-04-05 02:49:08

+0

将尝试tomorow ...现在我必须睡觉 – cfort 2011-04-05 03:16:40