9

ATLASを使おうとするのはこれが初めてです。正しくリンクできません。これは非常に単純な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);

        ...
}

標準のATLASがインストールされているLinuxプラットフォームでコンパイルすると、リンクエラーが発生します。

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

ご覧のとおり、ライブラリのさまざまな組み合わせを試してみましたが、役に立ちませんでした。私は何が間違っているのですか?

4

2 に答える 2

12

あなたが必要です

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

でコンパイルするからですg++

またはあなたもすることができます

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

Cとしてもコンパイルできるようにします。

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

于 2012-05-28T14:26:45.450 に答える
2

コードに注意してください。それはCではなく「C」です。したがって、コードは最終的に

#ifdef __cplusplus
extern "C"
{
#endif //__cplusplus
   #include <cblas.h>
#ifdef __cplusplus
}
#endif //__cplusplus
于 2012-08-23T01:18:37.510 に答える