【问题标题】:Lapacke in C: using dsymm, linker errorC中的Lapacke:使用dsymm,链接器错误
【发布时间】:2018-11-15 05:44:18
【问题描述】:

**编辑,包括问题末尾的更新。

当我尝试使用 LAPACKE 中的 dsymm 时,我收到“链接器命令失败”错误。 (所以,可能我编译的代码错了?)这是有问题的代码:

#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 的经验,所以可能有一个简单的错误。非常感谢任何见解。

编辑:谢谢你,弗朗西斯,问题是 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)

【问题讨论】:

  • 好吧,考虑到 这篇文章LAPACKE_dsymm 在网络上唯一出现过的 我非常怀疑这是一个错字!
  • 等等,也许你是对的。也许应该是 CBLAS_dsymm?但即使我这样做了,我也会收到链接器错误。
  • 好吧,请将其添加到您的问题中。我不是 Lapack 用户,也不是物理学家,无论是否感到困惑,但据我所知,dsymm 不是由 lapacke 导出的。
  • 好的,我已经更新了我的问题。而且,是的,这可能是最好的我们中的一个人不会感到困惑。感谢您的帮助。
  • 我怀疑目录/usr/local/opt/lapack/lib/ 包含一个不包含cblas 的blas 库。如果有 cblas 库,请尝试链接它。情况可能并非如此。事实上,如果 Lapack 已经被 cmake 编译过,那么 CmakeLists.txt 包含 option(CBLAS "Build CBLAS" OFF) :默认模式是编译 Lapack 和 Lapacke 而不编译 cblas。因此,要构建 makefile 并使用 cblas 重新编译 Lapack,您可以使用 cmake -DCBLAS=ON 之类的东西。

标签: c linker-errors matrix-multiplication lapacke


【解决方案1】:

dsyev 相反,例程dsymm 不在Lapack 库中。事实上,它是在 Blas 库中实现的,在 BLAS/SRC/dsymm.f 中。因此,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,但在我的情况下不是。

【讨论】:

  • 非常感谢,这对我有用! (我也不需要链接 cblas。)我需要做一些思考来理解为什么。另外,有没有办法也可以链接 LAPACKE 例程?我试过的都没有用。
  • 不客气!要链接 LAPACKE,它是 -llapacke -llapack -lblas-L 选项可以在 -L 之前使用,以便添加安装库的目录,就像 -I 用于标题一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
相关资源
最近更新 更多