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. linux下maven项目clean失败

    今天在linux下创建了一个项目自动化发布的脚本,在执行到 mvn clean package -Dmaven.test.skip=true 的时候,项目clean失败 查下下度娘,windows下导 ...

  2. autopy的使用探索

    autopy这个包可以直接操作电脑的一些行为,比如点击,移动鼠标啥的,但是可能只使用于windows,用处有限,不过做个简单的游戏辅助还是可以的. 网上资料贼少,很多不能用的,现总结一些可以用的放在这 ...

  3. java.lang.Object类

    Object类是java所有对象的基类,包含着java最核心和最基础的类,在编译时会自动导入.具体的类结构图: 1.构造器 public Object(); 大部分情况下,Java中通过形如 new ...

  4. [UE4]崩溃的原因收录

    UTool tool; 这样声明可以编译通过,但是UE4 Editor会直接崩溃. 应该改成这样: UTool* tool;

  5. 操他妈的,jquery1.4以上不能用toggle()轮流切换函数

    query 1.9里面已经删除了toggle(fn1, fn2)函数 (2013-05-07 13:44:27) 转载▼ 标签: it 分类: js jquery 1.9里面已经删除了toggle(f ...

  6. 模型融合策略voting、averaging、stacking

    原文:https://zhuanlan.zhihu.com/p/25836678 1.voting 对于分类问题,采用多个基础模型,采用投票策略选择投票最多的为最终的分类. 2.averaging 对 ...

  7. 第4章 文件和目录(5)_贯穿案例2:mini shell(1)

    6. 贯穿案例2:mini shell(1) [阶段性任务]实现cd.pwd和quit命令 //job.h #ifndef __JOB_H__ #define __JOB_H__ //接收命令行参数 ...

  8. C++多线程同步之Mutex(互斥量)

    原文链接: http://blog.csdn.net/olansefengye1/article/details/53086141 一.互斥量Mutex同步多线程 1.Win32平台 相关函数和头文件 ...

  9. dbms_xplan之display_cursor函数的使用

    DBMS_XPLAN包中display_cursor函数不同于display函数,display_cursor用于显示SQL语句的真实的执行计划,在大多数情况下,显示真实的执行计划有助于更好的分析SQ ...

  10. Missing write access to /usr/local/lib/node_modules/webpack/node_modules/assert

    1. 加上sudo指令 sudo npm install ... 2. 可能是网络原因, 改用cnpm cnpm install ...