【问题标题】:Fail to link c code to lapack / blas : undefined reference无法将 c 代码链接到 lapack / blas:未定义的参考
【发布时间】:2014-10-30 20:31:46
【问题描述】:

我已经尝试了几个小时,这让我发疯。我得到的最后一个错误是:

demo_cblas.c:(.text+0x83): undefined reference to `clapack_sgetrf'
demo_cblas.c:(.text+0xa3): undefined reference to `clapack_sgetri'

我正在编译代码使用

/usr/bin/gcc -o demo_cblas demo_cblas.c -L /usr/lib64 -l :libgfortran.so.3 -L /usr/lib64 \
    -llapack -L /usr/lib64 -lblas 

我尝试使用和不使用 libgfortran,使用不同的编译器 gcc-33、gcc-47、gcc-48。测试代码不是来自我,而是来自这个论坛......

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include "clapack.h"
#include "cblas.h"

void invertMatrix(float *a, unsigned int height){
int info, ipiv[height];
info = clapack_sgetrf(CblasColMajor, height, height, a, height, ipiv);
info = clapack_sgetri(CblasColMajor, height, a, height, ipiv);
}

void displayMatrix(float *a, unsigned int height, unsigned int width)
{
int i, j;
for(i = 0; i < height; i++){
for(j = 0; j < width; j++)
{
                printf("%1.3f ", a[height*j + i]);
        }
        printf("\n");
}
printf("\n");
}


int main(int argc, char *argv[])
{
int i;
float a[9], b[9], c[9];
srand(time(NULL));
for(i = 0; i < 9; i++)
{
        a[i] = 1.0f*rand()/RAND_MAX;
        b[i] = a[i];
}
displayMatrix(a, 3, 3);
return 0;
}

我使用的是 Suse 12.3 64 位。在 /usr/lib64 我有 liblapack.a liblapack.so, ... 和 libblas.a libblas.so, ... 和 libgfortran.so.3

没有函数“invertMatrix”的相同代码(使用库的代码)编译良好。

有什么想法或建议吗?

感谢大家的帮助。

Vava

【问题讨论】:

  • 什么是:libgfortran.so.3?为什么不只是gfortran
  • 在 /usr/lib64 中只有 libgfortran.so.3,没有 libgfortran.a 或 libgfortran.so。我不知道为什么会这样?我也读过 lapack 需要这个库,但在这种特殊情况下它似乎没有改变任何东西。
  • 听起来你缺少某种用于 libgfortran 的“开发”包——通常这就是从 /usr/lib64/libgfortran.so -> libgfortran.so.3 安装符号链接的东西。 “3”文件通常来自“运行时”包,如果您没有指向它的符号链接,那么您在某处缺少“开发”包。

标签: c gcc undefined lapack blas


【解决方案1】:

我非常肯定您还需要链接到 libcblas,这是 libblas 的 c 包装库。请注意,libblas 是一个 FORTRAN 库,因此不包含您正在调用的函数 clapack_*。

【讨论】:

  • 我尝试使用 libclas 但无济于事。关于 clapack_*,它在头文件 clapack.h 中定义。在这篇文章中stackoverflow.com/questions/6567849/…
  • 据说 clapack 可以使用 c 编译器使用一些“f2c 转换器”(我顺便安装了)进行编译。我知道我不必关心这种“转换”。我很困惑......
  • 如果你在 Windows 上工作,你可能想试试这个:hep.ph.liv.ac.uk/~hock/My_reports/CLAPACK/…。在 Linux 上,使用 GNU 科学库 (GSL) 附带的 cblas 会容易得多。更简单的是,您可以直接调用 fortran 函数而无需通过 clapack 包装器,因为您已经安装了 liblapack 和 libblas。
【解决方案2】:

我刚刚在 FreeBSD 上完成了这项工作:

gcc -o test test.c  \
-llapack -lblas -lalapack -lcblas

我已经安装了 math/atlas(来自 ports)以及 lapack 和 blas 包。

查看我的问题here

【讨论】:

    猜你喜欢
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    相关资源
    最近更新 更多