2012-05-28 9 views
8

ATLASを初めて使用しようとしています。私はそれを適切にリンクすることができません。ここでは非常に単純なSGEMMプログラムです:'cblas_sgemm'への定義されていない参照をリンクするATLAS gemm

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 

あなたが見ることができるように、私は違う与え試してみました:私は、標準的なATLASのインストールとLinuxプラットフォーム上でそれをコンパイル

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

     ... 
} 

は、それがリンクエラーを与えますライブラリの組み合わせは助けにはなりませんでした。私は間違って何をしていますか?

答えて

11

あなたはg++でコンパイルするので、あなたは

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

を必要としています。

それともあなたもまた、Cとしてコンパイルすることができるように

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

を行うことができます。

C++でコンパイルすると、名前がマングリングされることが予想されます。しかし、cblasはCでコンパイルされているので、エクスポートされたシンボルには名前が変更されていません。したがって、Cスタイルのシンボルを探すようにコンパイラに指示する必要があります。

+0

ですが、私は 'は'すでにこのガードを持っていないことを驚いています。 –

+0

ありがとうございます。私は今、図書館でこのガードをするのはかなり一般的だとは考えていませんでした。とにかく、ちょうどextern "C"をやってそれを動作させました。 – usman

1

コードには注意してください。それは「C」です、ないC. だから、コードは最終的にケースになりそう

#ifdef __cplusplus 
extern "C" 
{ 
#endif //__cplusplus 
    #include <cblas.h> 
#ifdef __cplusplus 
} 
#endif //__cplusplus 
関連する問題