Lapack 是一套被非常广泛使用的线性代数计算工具库,现在的主要编写语言时 Fortran90 。Lapack 基本上可以说是速度最快的线性代数计算库,我们看看官方给出的其被应用的几个地方就可以看出来:
 
high-level interface:
Matlab
Octave
NAG Numerical Librairies
Maple
R project
Scilab
 
列表上这些软件/语言是不是如雷贯耳,由此可见 Lapack 的流行程度。
 
Lapack同时有 Fortran 和 C/C++ 的接口,现在网上能找到的教程似乎都是 C 的居多,为此我整理了下我搭建 Lapack Fortran 使用环境的步骤,希望对其他人有帮助。
 
本文使用环境如下:
 
操作系统版本:Windows 
使用的编译器:gfortran (GCC版本.. MinGW环境)
Lapack版本: ..
 
1)MinGW设置:
 
由于需要使用自带的Makefile进行编译,因此要用到Makefile和自带的Make程序。对于Linux这当然不是问题,对于Windows而言则有点麻烦。
 
在 Windows 下使用make来编译程序有两种主要途径,分别是 Cygwin和 MinGW 。安装这两种软件(?)后他们就可以在 Windows 下模拟出 Linux 的使用环境。他们的主要区别我个人理解是:Cygwin 更偏向于模拟 Linux,因此编译出来的软件还是使用的 Linux 的一系列接口, Cygwin 则模拟这些接口,这也是为什么 Cygwin 编译出来的 Windows 程序还需要 cygwin1.dll 才能运行,同时效率也比较低,但是带来的好处是在两个系统上的兼容性好; MinGW 更倾向于让 Windows 用户使用 Linux 上的资源,因此编译出来的程序使用的是 Windows 的接口,速度也更快一些。
 
Cygwin 在安装的时候可选组件非常多,在 Cygwin 下如果你选择了安装 Make 组件,那么你可以在 CMD 命令行或者 Cygwin Shell 下同时用 Make 命令进行编译 ( CMD 命令行下可能还得再加个 Makefile 的文件名,具体我记不清了,但是肯定是可以做的),比较方便。
 
MinGW 相对麻烦一些,因为 MinGW 在安装时可选组件和定制项很少,不能单独安装 Make 组件。在 MinGW 下使用 Make的唯一方法,就是在安装时选择安装 MSYS Basic System。这个组件是模拟一个 Linux Shell ,这样我们就有类似 Cygwin 的能力了。
 
 
如果安装 MinGW 的时候没有安装这个组件,不要慌张,打开 MinGW 安装程序,再添加一下就行。有了这个组件后,关于MinGW的配置就大功告成了。
 
2)LAPACK源码下载及设置:
 
LAPACK 源码的下载可以去官网(http://www.netlib.org/lapack/)下,下载下来后是一个tgz文件。下载完成后解压之。
 
LAPACK 源码的 Makefile 和 make.inc 是我们需要根据系统环境修改的地方。默认源码里没有 make.inc ,但是有个 make.inc.example ,把它改名成 make.inc 。
 
打开 make.inc ,里面每个参数所需要注意的事项都注意得很清楚了,比如编译器选项什么的,根据你的需求改就是了。
 
贴一下我的 make.inc文件,由于官方默认设置就是基于gfortran所以其实我压根没改。
 
####################################################################
#  LAPACK make include file.                                       #
#  LAPACK, Version 3.4.0                                           #
#  April 2012                                                   #
####################################################################
#
SHELL = /bin/sh

#  Modify the FORTRAN and OPTS definitions to refer to the
#  compiler and desired compiler options for your machine.  NOOPT
#  refers to the compiler options desired when NO OPTIMIZATION is
#  selected.  Define LOADER and LOADOPTS to refer to the loader and
#  desired load options for your machine.
#
FORTRAN  = gfortran
OPTS     = -O2
DRVOPTS  = $(OPTS)
NOOPT    = -O0
LOADER   = gfortran
LOADOPTS =
#
# Timer for the SECOND and DSECND routines
#
# Default : SECOND and DSECND will use a call to the EXTERNAL FUNCTION ETIME
#TIMER    = EXT_ETIME
# For RS6K : SECOND and DSECND will use a call to the EXTERNAL FUNCTION ETIME_
# TIMER    = EXT_ETIME_
# For gfortran compiler: SECOND and DSECND will use a call to the INTERNAL FUNCTION ETIME
TIMER    = INT_ETIME
# If your Fortran compiler does not provide etime (like Nag Fortran Compiler, etc...)
# SECOND and DSECND will use a call to the INTERNAL FUNCTION CPU_TIME
# TIMER    = INT_CPU_TIME
# If neither of this works...you can use the NONE value... In that case, SECOND and DSECND will always return 0
# TIMER     = NONE
#
#  Configuration LAPACKE: Native C interface to LAPACK
#  To generate LAPACKE library: type 'make lapackelib'
#  Configuration file: turned off (default)
#  Complex types: C99 (default)
#  Name pattern: mixed case (default)
#  (64-bit) Data model: LP64 (default)
#
# CC is the C compiler, normally invoked with options CFLAGS.
#
CC = gcc
CFLAGS = -O3
#
#  The archiver and the flag(s) to use when building archive (library)
#  If you system has no ranlib, set RANLIB = echo.
#
ARCH     = ar
ARCHFLAGS= cr
RANLIB   = ranlib
#
#  Location of the extended-precision BLAS (XBLAS) Fortran library
#  used for building and testing extended-precision routines.  The
#  relevant routines will be compiled and XBLAS will be linked only if
#  USEXBLAS is defined.
#
# USEXBLAS    = Yes
XBLASLIB     =
# XBLASLIB    = -lxblas
#
#  The location of the libraries to which you will link.  (The
#  machine-specific, optimized BLAS library should be used whenever
#  possible.)
#
BLASLIB      = ../../librefblas.a
LAPACKLIB    = liblapack.a
TMGLIB       = libtmglib.a
LAPACKELIB   = liblapacke.a
 
这里吐槽下,我下载的 Lapack 版本是3.4.2,结果下载下来文件夹名是3.4.2,但是 make.inc 的注释版本是3.4.0,makefile的注释版本是3.4.1,你们敢认真点吗。
 
值得注意的是, Lapack 需要用到 Blas 库,因此你系统有无 Blas 库对应着两种不同的做法。
 
如果系统已经有了 Blas 库,或者说你想要用自己的 Blas 库,你需要修改 make.inc 里的 USEXBLAS 、 XBLASLIB 和 XBLASLIB 三个变量,修改完直接Make就行了。
 
如果系统没有 Blas 库,Lapack 源码里自己带了一个,可以直接用。那么保持 make.inc 里的设置如上文件所示,打开 Makefile,把 Blas 库加到编译目标里,就是 lib 参数编程:
 
lib: blaslib lapacklib tmglib
 
设置完成后打开 MinGW Shell ,一路 cd 到 Lapack 源码所在目录,输入 Make 回车,等待漫长编译过程。
 
编译完成后会自动对 Lapack 包进行测试,测试是调用一个 lapack_testing.py 文件进行测试。系统如果没有 Python 的话这一步应该会出错,需要注意下。(不过我 MinGW 默认安装后没有出错,可能已经自动安装了 Python)
 

 
3)Lapack的使用:
 
上面编译的设置是生成静态库,编译完成后我们就得到三个文件:
 
liblapack.a
librefblas.a
libtmglib.a
 
有三种方式可以使用 Lapack:
 
假设我们要编译一个程序 program.f90,对应方法如下:
 
a. 放到系统 lib 文件夹:
 
把上面三个文件直接拷贝到 MinGW 的 lib 文件夹下,然后再编译的时候直接加
 
gfortran program.f90 -llapack -lrefblas -o program.exe
 
即可链接程序。
 
b. 放到主程序根目录:
 
把上面三个静态链接库和程序放在一个目录下,然后用下面的命令编译
 
gfortran program.f90 liblapack.a librefblas.a -o program.exe
 
c. 在主程序目录单独给 lapack 库单独建个文件夹:
 
比如在 program.90 文件夹下新建 Lapack 文件夹,利用 -L 把这个文件夹添加到 lib 搜索路径里。编译命令就变成:
 
gfortran program.f90 -L./Lapack -llapack -lrefblas -o program.exe
 
我个人推荐采用第三种方式,一方面代码层次简洁美观,另外一方面减少代码阅读者对于搭建编译环境所需要的时间。
 
最后给个示例文件测试,使用第三种方法,源码:
 
,),b()
  integer ),iflag
  .,.,.,.,.,.,.,.,.],[,])
  b.,.,.]
  print ,,a,,v,b,,iflag)
  print *,'solve=',b
end program main
 
编译命令:
gfortran TestLapack.f90 -L./Lapack -llapack -lrefblas -o TestLapack.exe -Wall
 
结果:
 
 

Windows下Fortran编译Lapack库及使用的方法(转自新浪)的更多相关文章

  1. windows下Qt编译Qtxlsx库和qtxlsx库的使用方法

    最近接了个项目,合作的学长让用Qt写,而其中最重要的需求是将数据库的数据写入excel表格中和将excel的数据导入到数据库中,自己查阅了和多资料,最后决定使用qtxlsx开源库来操作excel,在编 ...

  2. Golang调用windows下的dll动态库中的函数 Golang 编译成 DLL 文件

    Golang调用windows下的dll动态库中的函数 package main import ( "fmt" "syscall" "time&quo ...

  3. 原创 C++应用程序在Windows下的编译、链接:第一部分 概述

    本文是对C++应用程序在Windows下的编译.链接的深入理解和分析,文章的目录如下: 我们先看第一章概述部分. 1概述 1.1编译工具简介 cl.exe是windows平台下的编译器,link.ex ...

  4. C++应用程序在Windows下的编译、链接(一)概述

    C++应用程序在Windows下的编译.链接(一)概述 本文是对C++应用程序在Windows下的编译.链接的深入理解和分析,文章的目录如下: 我们先看第一章概述部分. 1概述 1.1编译工具简介 c ...

  5. ACE在windows下的编译及配置(VS2010)

    ACE在windows下的编译及配置(VS2010) 分类:             -[小西南]-              2013-08-06 16:17     2354人阅读     评论( ...

  6. [转]QGis2.9在windows下的编译以及二次开发包下载

    今天心血来潮,将QGis在github上的代码更新后,又编译了一下.留意到源代码包里面的INSTALL文件有更新,于是本次编译完全基于官方的编译说明.编译过程非常顺利,除了在CMake的第一次conf ...

  7. windows下rabbitmq-c编译(带openssl、无需MinGW)

    因为项目原因,需要使用到rabbitmq的c客户端库.首先,参见上一篇windows下openssl编译,如果已经使用cmake编译过了,则先delete cache(File-Delete Cach ...

  8. Windows下PythonQt编译(vs2015+Qt5.11.2+PythonQt 3.2)探索

    时间:2018年10月20日 笔者最近在做Qt方面的开发工作,需用到脚本程序对程序内部进行扩展,就很自然的想到了PythonQt,下面介绍PythonQt在Windows下的的安装编译心得,水平有限, ...

  9. 设置 Quick-Cocos2d-x 在 Windows 下的编译环境

    http://cn.cocos2d-x.org/tutorial/show?id=1304 设置 Quick-Cocos2d-x 在 Windows 下的编译环境 Liao Yulei2014-08- ...

随机推荐

  1. A request has been denied as a potential CSRF attack错误解决方法

    2018-05-30 13:40:50 [http-nio-8081-exec-3] [ERROR] com.opensymphony.xwork2.interceptor.ParametersInt ...

  2. JVM内存监视手段和内存溢出解决方案

    引言 本文仅关注一些常见的虚拟机内存监视手段,以及JVM运行时数据区各个部分内存溢出的发生和对应的解决方案,总体来说属于概括性总结,涉及相对不是很深入,目的是让自己和其它初学者有一个框架性.概念性的了 ...

  3. sklearn的BaseEstimator、transformerMixin、ClassifierMixin、RegressorMixin、ClusterMixin介绍

    class sklearn.base.BaseEstimator:为所有的estimators提供基类 方法: __init__() 初始化方法 get_params(deep=True) 获取这个估 ...

  4. sklearn-MultinomialNB朴素贝叶斯分类器

    原型 class sklearn.naive_bayes.MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None) 参数 Parameter ...

  5. php 数组函数实例

    数组的概念 数组(array)是 PHP 中一个非常重要的概念,我们可以把数组看做一系列类似的数据的集合,实际上数组是一个有序图. PHP 还提供了超过 70 个内建函数来操作数组. 由于数组在php ...

  6. IIS7根据PID查找对应的站点

    runas /user:administrator cmd cd \Windows\System32\inetsrv appcmd.exe list wp

  7. Jenkins配置HTML报告(Windows环境)

    1.首先安装插件HTML Publisher,点击直接安装 2.在任务中配置,构建后操作,添加Publish HTML reports 3.添加完成后,新增一项 4.HTML directory to ...

  8. Linux 各类设置、配置、使用技巧参考,Linux使用集锦

    ========== 参考格式 (新增记录时,复制粘贴在下)============= [日期]: <标题> 参考链接ref1: 参考链接ref2: 正文: ========== 参考格式 ...

  9. 不常用的容易忘记常见mysql操作数据表命令

    删除外键关联的约束 alter table tablename drop  foreign key keyname;

  10. RAD 10.1多标签页bug

    frm->Parent= ActiveControl取不到了 ::setparent(frm-> 多屏幕显示器,次副屏幕上无法最大化了. ::SetParent(myform->Ha ...