**编辑,包括问题末尾的更新。
当我试图从LAPACKE中使用dsymm时,我得到了一个"linker command failed“错误。(所以,可能我编译的代码是错误的?)下面是有问题的代码:
#include "matrix_multiplication_attempt.h"
#include <stdio.h>
#include "lapacke.h"
int main ( )
{
/* 3x3 A matrix (symmetric) */
double a[] = {1,2,6,
2,3,1,
6,1,4};
/* 3x3 B Matrix */
double b[] = {2,3,4,
3,6,7,
4,7,4};
/* 3x3 C Matrix */
double c[] = {0,0,0,
0,0,0,
0,0,0};
char side, uplo;
int M,N, lda, ldb, ldc;
double alpha, beta,info;
side= 'L';
uplo='L';
M=3;
N=3;
alpha=1.0;
beta=0.0;
lda=3;
ldb=3;
info=8.0;
info=cblas_dsymm(side, uplo,
M,N, alpha, a,lda,
b,ldb,beta,c,ldc);
return info;下面是我得到的错误:
matrix_multiplication_attempt.c:51:10: warning: implicit declaration of function 'lapacke_dsymm' is invalid in C99 [-Wimplicit-function-declaration] info=lapacke_dsymm(side, uplo, ^ 1 warning generated. Undefined symbols for architecture x86_64: "_lapacke_dsymm", referenced from: _main in matrix_multiplication_attempt-e2c0b9.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
我没有使用C的经验,所以可能有一个简单的错误。任何洞察力都是非常值得欣赏的。
编辑:谢谢你,francis,问题是dsymm不是LAPACK的一部分,但在BLAS中,你的解决方案是有效的。现在,我更新的问题是:如何链接LAPACKE,以便可以在同一文件中同时使用LAPACKE和BLAS例程?我的编译尝试之一是:
gcc matrix_multiplication_attempt.c -o matrix_multiplication_attempt -lblas -Wall -I/usr/local/opt/lapack/include -L/usr/local/opt/lapack/lib/ -llapacke
但这会给出错误Undefined symbols for architecture x86_64: "_cblas_dsymm", referenced from: _main in matrix_multiplication_attempt-76b8f6.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
发布于 2018-06-06 02:17:48
与dsyev相反,例程dsymm不在Lapack库中。事实上,它是在BLAS/SRC/dsymm.f的Blas库中实现的。因此,在LAPACKE中没有这个例程的接口。
C程序的最佳替代方案是链接到CBLAS并使用cblas_dsymm()。
下面是一个示例代码:
#include<stdio.h>
#include<math.h>
#include<complex.h>
#include "cblas.h"
int main ( int argc, char **argv ){
int i,j;
int m=2;
int n=3;
double alpha=1.0;
double beta=1.0;
double AA[2][2]={{2,0},{0,1}};
double BB[2][3]={{1,0,0},{1,0,0}};
double CC[2][3]={{1,0,0},{1,0,0}};
int lda=2;
int ldb=n;
int ldc=n;
cblas_dsymm(CblasRowMajor,CblasLeft ,CblasUpper,m,n,alpha, &AA[0][0], lda, &BB[0][0], ldb, beta, &CC[0][0], ldc);
for(i=0;i<m;++i)
{
for(j=0;j<n;++j)
printf("%lf " ,CC[i][j]);
printf("\n");
}
return 0;
}我很惊讶地看到我成功地编译了它:gcc main.c -o main -lblas -Wall。事实上,我认为有必要通过gcc main.c -o main -lcblas -lblas -Wall链接cblas,但在我的情况下不是这样。
https://stackoverflow.com/questions/50705147
复制相似问题