9 votes

ATLAS gemm lie une référence non définie à 'cblas_sgemm'.

C'est la première fois que j'essaie d'utiliser ATLAS. Je ne parviens pas à le relier correctement. Voici un programme sgemm très simple :

...
#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);

        ...
}

Lorsque je le compile sur une plateforme linux avec une installation ATLAS standard, il donne une erreur de liaison :

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

Comme vous pouvez le voir, j'ai essayé de donner différentes combinaisons de bibliothèques mais cela n'a rien donné. Qu'est-ce que je fais de mal ?

12voto

Luchian Grigore Points 136646

Vous devez

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

parce que vous compilez avec g++ .

Ou vous pourriez même faire

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

pour pouvoir être compilé en C également.

Lorsque vous compilez en C++, on s'attend à ce que les noms soient tronqués. Mais comme cblas est compilé en C, les symboles exportés n'ont pas de noms tronqués. Vous devez donc demander au compilateur de rechercher les symboles de style C.

2voto

Sebas Points 21

Faites attention au code. C'est "C", pas C. Donc, le code est finalement

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X