2012-05-28 16 views
8

Esta es la primera vez que intento usar ATLAS. No puedo vincularlo correctamente. Aquí es un programa muy simple sgemm:ATLAS gemm linking undefined reference to 'cblas_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); 

     ... 
} 

Cuando compilo en una plataforma Linux con la instalación estándar de ATLAS, da error al vincular:

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 

Como se puede ver, he intentado dar diferentes combinación de bibliotecas, pero no ayudó. ¿Qué estoy haciendo mal?

Respuesta

11

Usted necesita

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

porque se compila con g++.

O incluso se podría hacer

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

a ser capaz de compilar como C también.

Cuando compila en C++, se espera que los nombres se arruinen. Pero como cblas está compilado en C, los símbolos exportados no tienen nombres destrozados. Por lo tanto, debe indicar al compilador que busque símbolos de estilo C.

+0

Es probable que sea el caso, pero me sorprende que '' no ya cuentan con este guardia. –

+0

Gracias. No pensé en eso, ya que es bastante común tener este guardia ahora en las bibliotecas. De todos modos, simplemente haciendo extern "C" lo hizo funcionar. – usman

1

Tenga cuidado con el código. Se trata de "C", no C. Por lo tanto, el código de fin es

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