c - Lapacke in C : using dsymm, 链接器错误

标签 c linker-errors matrix-multiplication lapacke

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

当我尝试使用 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:警告:隐式声明 函数 'lapacke_dsymm' 在 C99 中无效 [-Wimplicit-function-declaration] 信息=lapacke_dsymm(边,uplo, ^ 生成 1 个警告。 体系结构 x86_64 的 undefined symbol : “_lapacke_dsymm”,引用自: matrix_multiplication_attempt-e2c0b9.o 中的_main ld: 找不到体系结构 x86_64 的符号 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

我没有使用 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/p>

但这给出了错误 体系结构 x86_64 的 undefined symbol : “_cblas_dsymm”,引用自: matrix_multiplication_attempt-76b8f6.o 中的_main ld: 找不到体系结构 x86_64 的符号 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

最佳答案

dsyev相反,例程dsymm不在Lapack库中。实际上,它是在 Blas 库中实现的,在 BLAS/SRC/dsymm.f 中.因此,在 LAPACKE 中没有这个例程的接口(interface)。

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,但在我的情况下不是。

关于c - Lapacke in C : using dsymm, 链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50705147/

相关文章:

ios - 不同文件中不能有 2 个同名常量吗?

CUDA 确定每个 block 的线程、每个网格的 block

c - 奇数 "undefined reference"错误

matrix-multiplication - 缓存友好的方法来乘以两个矩阵

performance - 如何解释矩阵乘法 GFLOP/s 中的这种差异?

c - 在函数中分配结构体数组

c - 如何在C中调用Rust函数?

c - 从 C 设置和获取 lua 表

c - 限制用户在 C 上的类型长度

c++ - 什么是 undefined reference / Unresolved external symbol 错误,我该如何解决?