前言
本文需要感谢@yx的大力指导。
1. 下载 & 解压
使用wget
命令进行下载(也可以用浏览器)
wget www.netlib.org/clapack/clapack.tgz
下载完会多出一个clapack.tgz
压缩包文件(名字一般是红色的)
然后解压文件(注:版本可能不同)
tar xvf clapack.tgz
2. make
进入解压后的文件夹
cd CLAPACK-3.2.1
首先改个名,来使用官方提供的example文件
mv make.inc.example make.inc
然后开始make,来得到我们需要的四个lib文件(过程中可以使用-j
命令多线程加速)
make f2clib # get `./F2CLIBS/libf2c.a`
make blaslib # get `./blas_LINUX.a`
make # get `./tmglib_LINUX.a` and `./lapack_LINUX.a`
等待完成后,没有出错即可进入下一步(关于testing
的报错可以忽略)
(注:除了得到了需要的lib文件外,lapack,blas等的源代码可以在BLAS/SRC
,SRC/
,F2CLIBS/SRC
目录下找到)
3. 收尾工作
接下来修改一下文件权限
chmod 644 INCLUDE/*.h
并且把头文件考入系统目录
sudo cp INCLUDE/*.h /usr/include
最后把之前make得到的四个lib文件(libf2c.a
,blas_LINUX.a
,tmglib_LINUX.a
,lapack_LINUX.a
)放在喜欢的目录下即可(比如我放在了~/Documents
下新建的一个lapack-libs
文件夹里)。
4. 使用
上面的步骤做完后就可以写程序使用了
在使用时需要按顺序导入这些包
#include <blaswrap.h>
#include <f2c.h>
#include <clapack.h>
编译链接库的时候,如果觉得需要挨个链接文件太麻烦的话,可以先把库文件融合到一个文件里。方法如下:
- 新建一个空文件夹并进入,比如
mkdir tmp && cd tmp
- 将四个lib文件中的内容(也就是一堆
.o
文件)抽取到当前新建的这个空文件夹下# 命令中的括号需要改为文件对应的路径 ar -x <lapack_LINUX.a的存放路径> # 如:ar -x ~/Documents/lapack-libs/lapack_LINUX.a ar -x <libf2c.a的存放路径> ar -x <tmglib_LINUX.a的存放路径> ar -x <blas_LINUX.a的存放路径>
- 最后,将抽取出的内容融合为一个文件(比如叫做
libclapack.a
,存放到~/Documents
文件夹里)ar -r <融合后新建的文件的路径> *.o # 如:ar -r ~/Documents/libclapack.a *.o
这样,以后编译时只需要链接libclapack.a
这一个文件就够了,具体方法是:
gcc -o <输出文件名> <待编译文件名> <libclapack.a文件路径> -lm # 如:gcc -o test test.c ~/Documents/libclapack.a -lm
(注:有的情况下可以省略-lm
)
可以使用如下代码进行编译测试
#include<blaswrap.h>
#include<f2c.h>
#include<clapack.h>
#include<complex.h>
#include<math.h>
#include<malloc.h>
#include<stdio.h>
int main(int argc, char** argv)
{
integer N, INCX, INCY;
double *DX, *DY;
N = 3;
INCX = 1, INCY = 1;
DX = (double*)malloc(N * sizeof(double));
DY = (double*)malloc(N * sizeof(double));
DX[0] = 1.0;
DX[1] = 2.0;
DX[2] = 3.0;
dcopy_(&N, DX, &INCX, DY, &INCY);
for(int i = 0; i < N; i++)
{
printf("%lf\n", DY[i]);
}
return 0;
}