Linux环境下Lapack软件包的编译和使用
自行下载编译过程
  1. netlab 下载最新版本的源代码
  2. 将源代码解压缩
     3. 编辑 make.inc 文件,进行一些系统相关的编译参数设置
 一些编译参数,
PLAT 表示使用的平台,会接在生成lib库的名字中,原本是 _LINUX
FORTRAN 表示你使用的fortran编译器,根据自己安装的编译器来设置,我用的是 gfortran
OPTS 表示 编译时的优化程度,设置为 -O2即可。
LOADER 设置成和FORTRAN 基本一样就可以了。
确定生成目标如下,
BLASLIB = wwwblogs/libblas$(PLAT).a
LAPACKLIB = liblapack$(PLAT).a
TMGLIB = libtmglib$(PLAT).a
EIGSRCLIB = libeigsrc$(PLAT).a
LINSRCLIB = liblinsrc$(PLAT).a
  原来的这些库文件的名字前面没有lib的,这里加上。因为linux上库文件一般有前缀lib的,在链接的时候 -l后面带的是库的名字,那个时候是不加lib的。如果已经编译生成了这些库,可以重命名,而不用重新编译。
  PLAT 设置生成的库函数的后缀,比如 SUN LINUX之类的,当然也可以不设置;
  FORTRAN 设置编译器,比如 g77 gfortran ifort g95 等等;(我设置为FORTRAN  = ifort -g
  OPT:设置编译选项,根据具体的编译器和优化要求进行设置;
  LOADER 设置成和FORTRAN 一样就可以了;
  4. 编辑 Makefile
  到 lib 选项。然后设置需要编译的库函数如下
  #lib lapacklib tmglib
  lib blaslib lapacklib tmglib
  默认的情况是不编译 blas 库的。(除非事先编译好了blas库,否则应一起编译。)
  5. 编译和测试 Lapack.
  在源代码的根目录下输入 make 回车。然后 make 程序就会自动进行编译和测试。
  6. Lapack 函数的使用
  如果编译和测试顺利的话会在源代码的根目录下生成三个文件 lapack_LINUX.ablas_LINUX.atmglib_LINUX.a,其中lapack_LINUX.a blas_LINUX.a 就是我们所需要的库函数。它们的使用有多种途径:
方法1
  将lapack_LINUX.a blas_LINUX.a所在路径加入到LD_LIBRARY_PATH环境变量
  在命令行输入 echo $LD_LIBRARY_PATH,结果为/usr/lib/alliance/lib:/usr/lib/alliance/lib
  输入LD_LIBRARY_PATH=$LD_LIBRARY_PATH/home/fengwei.igg/lapack-3.2.1
     输入 export LD_LIBRARY_PATH
  进入代码所在目录,输入 ifort test.f90 lapack_LINUX.a blas_LINUX.a
  编译生成a.out文件,命令行执行./a.out,输出结果。
方法2
首先,必须将lapack_LINUX.a blas_LINUX.a库文件重命名为liblapack_LINUX.a libblas_LINUX.a
如以上两文件在/home/fengwei.igg/lapack-3.2.1 文件夹下,在命令行输入
ifort test.f90 -L/home/fengwei.igg/lapack-3.2.1 -llapack_LINUX -lblas_LINUX
编译生成a.out文件,命令行执行./a.out,输出结果。
方法3:
把lapack_LINUX.a 和blas_LINUX.a拷贝至代码所在目录,
输入 ifort test.f90 lapack_LINUX.a blas_LINUX.a
编译生成a.out文件,命令行执行./a.out,输出结果。
使用intel商业mkl库调用lapack
如果安装了intel公司的mkl数据库,则里面包含了lapack库,简单的使用方法为在命令行输入:
ifort test.f90  -L/opt/intel/mkl/10.2.2.025/lib/32 -lmkl_lapack95 -lguide  -lmkl_core -lmkl_intel -lmkl_intel_thread  -lpthread
如出现如下类似错误:
error while loading shared libraries: libguide.so: cannot open shared object file: No such file or directory
解决方法为将/opt/intel/mkl/10.2.2.025/lib/32添加到LD_LIBRARY_PATH,如方法1.
编译生成a.out文件,命令行执行./a.out,输出结果。
实例
 test.f90源文件:
program test_sgesv
implicit none
real :: a(3,3),b(3)
integer :: v(3),iflag
external sgesv
a=reshape([2.0,0.0,0.0,0.0,3.0,0.0,0.0,0.0,4.0],[3,3])
b=[998.0,999.0,1000.0]
print *,'a=',a
print *,'b=',b
call sgesv(3,1,a,3,v,b,3,iflag)
c语言编译器怎么安装print *,'solve=',b
end program test_sgesv

输出结果:
 a=  2.000000      0.0000000E+00  0.0000000E+00  0.0000000E+00  3.000000   
  0.0000000E+00  0.0000000E+00  0.0000000E+00  4.000000   
 b=  998.0000      999.0000      1000.000   
 solve=  499.0000      333.0000      250.0000 
LAPACKE的安装
  从网站上下载lapacke的压缩包,就是Standard C language APIs for LAPACK对应的压缩包,解压缩,查看README文件。
同样地,需要修改make.inc文件,
CC 表示使用的C程序编译器,改成 gcc,
LINKER 表示编译时要使用的连接器,前面几行注释提到了,
之前编译lapack.a blas.a用的什么fortran编译器,这里就用什么。那么改成 gfortran.

LAPACKE 表示要生成的库文件的名字,类似的,改成liblapacke.a
LAPACKE的编译需要之前生成的lapack库文件,所以LIBS这一行需要设置好。
LIBS = $(LAPACK_PATH)/liblapack.a $(LAPACK_PATH)/libblas.a
注意这里liblapack.a文件全名应该是liblapack$(PATH).a,PATH对应LAPACK文件make.incPATH
其中LAPACK_PATH就是liblapack.a所在的目录了。
查看以下Makefile,没什么需要修改的,可以直接make,或者是make lapacke, 不让它编译test的内容。然后就生成liblapacke.a了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。