2012-05-28 10 views
8

To jest pierwszy raz próbuję użyć ATLAS. Nie jestem w stanie poprawnie go powiązać. Tutaj jest bardzo prosty program sgemm:Gemm ATLAS łączenie niezdefiniowanych odniesień do '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); 

     ... 
} 

Kiedy skompilować go na platformie Linux z instalacji standardowej ATLAS, daje łączenie błąd:

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 

Jak widać, próbowałem podając inny połączenie bibliotek, ale nie pomogło. Co ja robię źle?

Odpowiedz

11

Trzeba

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

ponieważ kompilacji z g++.

Albo można nawet zrobić

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

móc skompilować jak C również.

Podczas kompilacji w C++ oczekuje się, że nazwy zostaną zmanipulowane. Ale ponieważ cblas jest kompilowany w C, wyeksportowane symbole nie mają zniekształconych nazw. Musisz więc poinstruować kompilator, aby szukał symboli w stylu C.

+0

prawdopodobnie będzie to przypadek, ale jestem zaskoczony, że '' nie mają już tego strażnika. –

+0

Dzięki. Nie myślałem o tym, ponieważ jest to dość powszechne, że ten strażnik ma teraz kilka dni w bibliotekach. W każdym razie, zrobienie extern "C" sprawiło, że zadziałało. – usman

1

Uważaj na kod. To „C”, a nie C. Więc kod wreszcie jest

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