无法将C代码链接到Lapack / Blas:未定义的引用。

3

我已经尝试了几个小时,实在让我抓狂。我最后得到的错误是:

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 - John Zwinck
在 /usr/lib64 中只有 libgfortran.so.3,没有 libgfortran.a 或 libgfortran.so。我不知道为什么会这样?我也读到过 lapack 需要这个库,但在这种特定情况下似乎没有什么改变。 - user3778776
听起来你缺少某种libgfortran的“dev”包——通常这个包会安装一个符号链接从/usr/lib64/libgfortran.so -> libgfortran.so.3。而“3”文件通常来自于一个“runtime”包,如果你没有它的符号链接,那么你就缺少了某个“dev”包。 - John Zwinck
2个回答

2

我相信你还需要链接到libcblas,它是libblas的C语言包装库。需要注意的是,libblas是一种FORTRAN库,因此不包含你调用的clapack_*函数。


我尝试使用libclas,但没有成功。关于clapack_*,它在头文件clapack.h中定义。在这篇文章中https://dev59.com/IljUa4cB1Zd3GeqPVeF- - user3778776
据说 clapack 可以使用一些“f2c 转换器”(我已经安装了)通过 C 编译器进行编译。我明白我不必担心这个“转换”。但我感到困惑... - user3778776
如果你正在使用Windows,你可能想尝试这个链接:http://hep.ph.liv.ac.uk/~hock/My_reports/CLAPACK/CLAPACK%20INSTALLING,%20USING.htm。在Linux上,使用GNU科学库(GSL)自带的cblas要容易得多。更简单的方法是,你可以直接调用Fortran函数,而不必经过clapack包装器,因为你已经安装了liblapack和libblas。 - downhillFromHere

0

我刚在FreeBSD上用以下方法使其工作:

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

我已经安装了math/atlas(从ports),以及lapack和blas软件包。

请参见我的问题此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接