2012-05-28 11 views
8

Dies ist das erste Mal, dass ich versuche, ATLAS zu verwenden. Ich bin nicht in der Lage, es richtig zu verknüpfen. Hier ist ein sehr einfaches sgemm Programm:ATLAS gemm Verknüpfung undefined Verweis auf '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); 

     ... 
} 

Wenn ich es auf einer Linux-Plattform mit Standard-ATLAS Installation kompilieren, gibt es die Verknüpfung Fehler:

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 

Wie Sie sehen können, habe ich versucht, verschiedene geben Kombination von Bibliotheken, aber hat nicht geholfen. Was mache ich falsch?

Antwort

11

Sie benötigen

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

, weil Sie mit g++ kompilieren.

Oder Sie könnten sogar tun

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

der Lage sein, wie C auch zu kompilieren.

Wenn Sie in C++ kompilieren, wird erwartet, dass die Namen verändert werden. Aber da cblas in C kompiliert wird, haben die exportierten Symbole keine verfälschten Namen. Sie müssen also den Compiler anweisen, nach Symbolen im C-Stil zu suchen.

+0

wahrscheinlich der Fall zu sein, aber ich bin überrascht, dass '' nicht bereits diese Wache haben. –

+0

Danke. Ich habe nicht darüber nachgedacht, da es ziemlich üblich ist, diesen Wächter jetzt ein paar Tage in Bibliotheken zu haben. Wie auch immer, nur extern "C" zu machen, hat es funktioniert. – usman

1

Seien Sie vorsichtig mit dem Code. Es ist „C“, nicht C. So, endlich ist der Code

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