我该如何解决这个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库中。
包含头文件与链接库不相同。
我实际上并不知道有关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变量。试用+ =而不是=。
您的观点通常是真实的,但是对于R,libR.so共享库通常与libblas链接,因此BLAS符号应该可见。查看我的答案以获得工作演示。 – 2011-04-04 22:34:11
它在这里工作(并请忽略我的~/.R/Makevars
选择特定CC
和CFLAGS
;也忽略次要空白编辑):
[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是在静态库配置中本地构建的?
我在Windows上编码。这可能是原因吗? – cfort 2011-04-04 23:06:16
也许吧。您可以尝试更加明确 - 相应地尝试设置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"
,现在它的工作原理。
不要添加aswer,而要编辑自己的问题。另外,你想''PKG_LIB + = ...'作为'='简单覆盖。 – 2011-04-05 00:06:28
从'[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
将尝试tomorow ...现在我必须睡觉 – cfort 2011-04-05 03:16:40
R_ext/BLAS.h是dswap的头文件 – cfort 2011-04-04 22:10:37
@ user605507:包含头与链接库不同。 – 2011-04-04 22:31:00