2012-05-28 12 views
8

Questa è la prima volta che cerco di utilizzare ATLAS. Non sono in grado di collegarlo correttamente. Ecco un programma molto semplice sgemm:Gemma ATLAS che collega un riferimento indefinito a '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); 

     ... 
} 

Quando compilo su una piattaforma Linux con installazione standard ATLAS, dà il collegamento di errore:

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 

Come potete vedere, ho provato dando diversa combinazione di librerie ma non ha aiutato. Che cosa sto facendo di sbagliato?

risposta

11

È necessario

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

perché si compila con g++.

Oppure si potrebbe anche fare

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

per essere in grado di compilare il C anche.

Quando si compila in C++, i nomi dovrebbero essere storpiati. Ma poiché le cblas sono compilate in C, i simboli esportati non hanno nomi storti. Quindi devi istruire il compilatore per cercare i simboli in stile C.

+0

probabile che sia il caso, ma sono sorpreso che '' non hanno già questa guardia. –

+0

Grazie. Non ci avevo pensato perché è abbastanza comune avere questa guardia ora un giorno nelle biblioteche. Ad ogni modo, solo fare "C" dall'esterno ha funzionato. – usman

1

Fare attenzione al codice. Si tratta di "C", non C. Quindi, il codice è finalmente

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