Как я могу исправить эту ошибку c кодом / BLAS? - PullRequest
0 голосов
/ 05 апреля 2011

Я пытаюсь написать функцию ac (которая позже будет использоваться в сценариях R), которая использует BLAS lib из 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 ]

3 голосов
/ 05 апреля 2011

Включение заголовочного файла - это не то же самое, что ссылка на библиотеку.

На самом деле я ничего не знаю о R, но я провел поиск и нашел http://cran.r -project.org / doc / manual / R-exts.html # Create-shared-objects указывает, что вам нужна переменная BLAS_LIBS - если вы не используете make-файл, похоже, что вы можете просто получить выходные данные команды "R CMD config BLAS_LIBS" и затем включить выходные данные в командной строке. Вы также можете просто добавить его в переменную PKG_LIBS, но я не знаю достаточно о R, чтобы быть уверенным.

EDIT:

установил файл Makevars.win для включения

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

Что заменяет переменную PKG_LIBS на LAPAK_LIBS. Попробуйте с + = вместо =.

1 голос
/ 05 апреля 2011

установили файл Makevars.win включает

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

но ошибка сохраняется.

БИНГО: добавлено к

"R CMD SHLIB foo.c"

вывод от

* * 1010

как в

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

и теперь это работает.

0 голосов
/ 05 апреля 2011

Здесь это работает (и, пожалуйста, не обращайте внимания на то, что мой ~/.R/Makevars выбирает определенные CC и 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 локально встроен в конфигурацию статической библиотеки?

0 голосов
/ 05 апреля 2011

Это должно быть связано с тем, что обеспечивает функцию dswap.Я думаю, это в библиотеке R.

...