未能将c代码链接到lapack:undefined reference

时间:2014-10-29 17:07:39

标签: gcc freebsd lapack

我正在尝试使用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。:我已经按照各种顺序尝试了这些库,我也尝试了其他libs,如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(作为地图集的一部分安装)。 clapack.h包含违规函数---那么它们怎么能找不到?

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

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

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

任何帮助都非常感激。

由于

伊万

1 个答案:

答案 0 :(得分:0)

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

这次,/ usr / local / lib包含一个新的lib文件:libcblas.so ---以前的随机安装必须删除它。

编译的gcc行现在是:

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

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