【问题标题】:Failing to link c code to lapack: undefined reference无法将 c 代码链接到 lapack:未定义的引用
【发布时间】:2014-12-25 12:36:16
【问题描述】:

我正在尝试使用 C 中的 lapack 函数。

这是一些测试代码,复制自this question

#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;
}

我用 gcc 编译这个:

gcc -o test test.c  \
    -lblas -llapack -lf2c

n.b.:我以各种顺序尝试了这些库,我还尝试了其他库,如 latlas、lcblas、lgfortran 等。

错误信息是:

/tmp//cc8JMnRT.o: In function `invertMatrix':
test.c:(.text+0x94): undefined reference to `clapack_sgetrf'
test.c:(.text+0xb4): undefined reference to `clapack_sgetri'
collect2: error: ld returned 1 exit status

clapack.h 被发现并包含(作为 atlas 的一部分安装)。 clapack.h 包含有问题的函数 --- 那怎么找不到呢?

这些符号实际上在 libalapack 库中(使用 strings 找到)。但是,将 -lalapack 添加到 gcc 命令似乎需要添加 -lcblas (许多未定义的 cblas_* 引用)。安装 cblas 会自动卸载 atlas,从而删除 clapack.h。

所以,这感觉就像某种依赖地狱。

我在 FreeBSD 10 amd64 上,所有相关库似乎都已安装并且在正确的路径上。

非常感谢任何帮助。

谢谢

伊万

【问题讨论】:

  • 我已经阅读了这个问题 obvs - 请注意我链接到它。我不认为这是重复的,另一个问题没有得到充分的回答。
  • 看起来您并没有尝试过重复问题的答案中的建议,即将-lcblas 添加到您的命令行? (哦,我的错,我只是更仔细地重新阅读了您的问题,毕竟您提到了 libcblas - 这没有帮助吗?)。无论如何,我现在已经撤回了我的近距离投票。
  • 谢谢 :) 就我而言,今天早上我做了更多工作,并在错误消息后添加了更多详细信息。
  • 我现在只是在 OS X 上尝试这个,它应该足够接近 FreeBSD 来看看发生了什么......
  • OK - 在 OS XI 上可以用-llapack -lblas -latlas 编译它 - 你似乎需要-llapack 来获得clapack_sgetrf/clapack_sgetri,然后你需要另外两个来解决进一步的依赖关系来自liblapack

标签: gcc freebsd lapack


【解决方案1】:

我卸载了所有远程相关的东西 --- blas、cblas、lapack、atlas 等 --- 然后单独重新安装了 atlas(从端口),然后是 lapack 和 blas 包。

这一次,/usr/local/lib 包含一个新的 lib 文件:libcblas.so --- 之前的随机安装肯定已经删除了它。

现在编译的 gcc 行是:

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

更改 -l 参数的顺序似乎没有任何区别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 2011-05-03
    相关资源
    最近更新 更多