0

RのBLASlibを使用する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について何も知りませんが、検索を行ったところ、BLAS_LIBSが必要であることを示すhttp://cran.r-project.org/doc/manuals/R-exts.html#Creating-shared-objectsを見つけました変数 - メイクファイルを使用していない場合は、コマンド「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

ファイル 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"

そして今それは動作します。

于 2011-04-04T23:34:05.813 に答える
0

機能を提供するものにリンクする必要がありdswapます。それはRライブラリにあると思います。

于 2011-04-04T21:57:52.030 に答える
0

ここで動作します (そして、 myが特定のand~/.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 は静的ライブラリ構成でローカルにビルドされていますか?

于 2011-04-04T22:28:11.090 に答える