ATLAS gemm связывает неопределенную ссылку с cblas_sgemm

Это первый раз, когда я пытаюсь использовать ATLAS. Я не могу связать это правильно. Вот очень простая программа sgemm:

...
#include <cblas.h>


const int M=10;
const int N=8;
const int K=5;

int main()
{
    float *A = new float[M*K];
    float *B = new float[K*N];
    float *C = new float[M*N];

    // Initialize A and B

    cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, M, N, K, 1.0, A, K, B, N, 0.0, C, N);

        ...
}

Когда я скомпилирую его на платформе Linux со стандартной установкой ATLAS, он выдает ошибку связывания:

g++ test.c -lblas -lcblas -latlas -llapack
/tmp/cc1Gu7sr.o: In function `main':
test.c:(.text+0x29e): undefined reference to `cblas_sgemm(CBLAS_ORDER, CBLAS_TRANSPOSE, CBLAS_TRANSPOSE, int, int, int, float, float const*, int, float const*, int, float, float*, int)'
collect2: ld returned 1 exit status

Как видите, я пробовал давать разные комбинации библиотек, но не помогло. Что я делаю не так?


person usman    schedule 28.05.2012    source источник


Ответы (2)


Тебе нужно

extern "C"
{
   #include <cblas.h>
}

потому что вы компилируете с g++.

Или вы могли бы даже сделать

#ifdef __cplusplus
extern "C"
{
#endif
   #include <cblas.h>
#ifdef __cplusplus
}
#endif

чтобы иметь возможность компилировать как C также.

При компиляции на C++ предполагается, что имена будут искажены. Но поскольку cblas компилируется на C, экспортируемые символы не имеют искаженных имен. Таким образом, вы должны указать компилятору искать символы в стиле C.

person Luchian Grigore    schedule 28.05.2012
comment
Скорее всего так и есть, но я удивлен, что у <cblas.h> еще нет этого охранника. - person Stephen Canon; 28.05.2012
comment
Спасибо. Я не думал об этом, потому что сейчас в библиотеках часто бывает такой охранник. В любом случае, простое выполнение extern C заставило его работать. - person usman; 28.05.2012

Будьте осторожны с кодом. Это "C", а не C. Итак, наконец-то код

#ifdef __cplusplus
extern "C"
{
#endif //__cplusplus
   #include <cblas.h>
#ifdef __cplusplus
}
#endif //__cplusplus
person Sebas    schedule 23.08.2012