编译期间无法从 Accelerate Framework 链接 BLAS -OS Yosemite 10.0.5

问题描述 投票:0回答:1

我为分配创建了一个矩阵重数代码,但无法使该函数正常工作,所以我怀疑这是 BLAS 库未正确链接。 在 OS X 中,BLAS 已内置到 Accelerate Framework 中,因此在 makefile 中我通过

-framework Accelerate
链接了库,在 cpp 中我还通过
#include<Accelerate/Accelerate.h>

包含了标头

编译过程中,我的错误是:

Undefined symbols for architecture x86_64:
"dgemm_(char*, char*, int*, int*, int*, double*, double*, int*, double*, int*, double*, double*, int*)"

所以我创建了一个简单的测试代码,但在编译过程中仍然出现错误:

test_2.cpp:35:3: error: use of undeclared identifier 'dgemm_'
  dgemm_(&TRANSA, &TRANSB, &M, &N, &K, &ALPHA, A, &LDA, B, &LDB, &BETA, ...
  ^
  1 error generated.

我的简单测试代码是用

编译的
 clang++  -o test_2.exe test_2.cpp -framework Accelerate

我的简单代码是:

#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cfloat>
#include <cmath>
#include <sys/time.h>
#ifdef __APPLE__
#include <Accelerate/Accelerate.h>
#else
#include <cblas.h>
#endif

using namespace std;
int main( int argc, char **argv )
{
 int n=10;
 int N=n;
 double *A = (double*) malloc( n * n * sizeof(double) );
 double *B = (double*) malloc( n * n * sizeof(double) );
 double *C = (double*) malloc( n * n * sizeof(double) );
 char TRANSA = 'N';
 char TRANSB = 'N';
 int M = N;
 int K = N;
 double ALPHA = 1.;
 double BETA = 0.;
 int LDA = N;
 int LDB = N;
 int LDC = N;
 dgemm_(&TRANSA, &TRANSB, &M, &N, &K, &ALPHA, A, &LDA, B, &LDB, &BETA, C, &LDC);
 return 0;
}
c++ macos frameworks lapack blas
1个回答
2
投票

根据文档,Accelerate.framework 为所有 BLAS 函数添加前缀

cblas_
。例如,
dgemm
函数被声明为

void cblas_dgemm(const enum CBLAS_ORDER ORDER, const enum CBLAS_TRANSPOSE TRANSA, const enum CBLAS_TRANSPOSE TRANSB, const __LAPACK_int M, const __LAPACK_int N, const __LAPACK_int K, const double ALPHA, const double *A, const __LAPACK_int LDA, const double *B, const __LAPACK_int LDB, const double BETA, double *C, const __LAPACK_int LDC);
© www.soinside.com 2019 - 2024. All rights reserved.