我刚开始使用Fortran,在我的程序中使用BLAS模块从LAPACK中遇到了问题。
我正在使用Ubuntu 18.04,已经通过命令sudo apt-get install libblas-dev liblapack-dev
安装了LAPACK和BLAS包。我还从http://www.netlib.org/lapack/网站下载了LAPACK,并按照此视频中的说明进行安装。
我的程序应该使用blas_sparse
模块,因此我编写了类似以下的代码:
program example
use blas_sparse
implicit none
! some code ...
end program example
我正在尝试使用以下命令使用gfortran
编译我的代码(example.F90
):
gfortran example.F90 -llapack -lblas
就像这个示例视频(1:11)上的操作一样。但是它并不能正常工作,编译器会返回以下错误信息:
example.F90:3:8:
use blas_sparse
1
Fatal Error: Can't open module file ‘blas_sparse.mod’ for reading at (1): No such file or directory
这里的问题是什么?我看到三个潜在原因:
- 代码有误。
- 我用来编译的命令不正确。
- LAPACK 和 BLAS 没有真正安装。
blas_sparse
的模块?此外,这只是把问题转移到了另一个地方,因为我仍然需要从 BLAS 中导入某些过程。不幸的是,我不知道 use
命令如何工作,所以我不知道应该尝试改变什么。ad. 2. 也许我的编译器不知道
-llapack
和 -lblas
库的位置。我尝试明确写出它们,并使用它们:gfortran example.F90 -llapack -lblas -L/usr/local/lib
在安装LAPACK和BLAS时,我创建了指向liblapack.a
和liblapack.a
的符号链接(参见ad. 3.)。我不知道-llapack
和-lblas
标志是什么,这使得我很难检查编译器是否“能看到”它们。
ad. 3. 我在计算机上安装BLAS和LAPACK的步骤如下:
- 从netlib.org/lapack网站下载LAPACK 3.8.0
- 使用以下命令提取库并将文件安装在计算机上
:
tar zxvf lapack-3.8.0.tar.gz
cd lapack-3.8.0/
cp make.inc.example make.inc
make blaslib
make lapacklib
sudo ln -s /home/Download/lapack-3.8.0/liblapack.a /usr/local/lib/liblapack.a
sudo ln -s /home/Download/lapack-3.8.0/librefblas.a /usr/local/lib/librefblas.a
还可以通过apt-get
安装它:
sudo apt-get install libblas-dev liblapack-dev
我非常感谢任何帮助解决这个问题的人。
编辑:
我实际上发现应该使用来自BLAST网站的blas_sparse.f90
、blas_sparse_namedconstant.f90
和blas_sparse_proto.h
文件创建那些.mod
文件。前两个文件我只是作为模块添加到我的代码中,gfortan编译器会创建正确的(我希望如此).mod
文件。但是第三个文件是用C语言编写的,因此我不能将其直接放入我的代码中。
所以现在的问题是如何将.h
文件与我的代码绑定。我需要创建一些makefile
或编译.h
文件以创建.mod
文件吗?
编辑2:
看起来我只是没有从BLAST网站安装稀疏BLAS。我应该做的是:
- 下载库:
wget -P target/directory/ http://www.netlib.org/toms/818
- 解压文件:
mv 818 818.gz
gunzip 818.gz
- 删除前三行并添加
.sh
扩展名:
tail -n +4 818 > 818.sh; rm 818
- 安装库:
bash 818.sh
# before doing the following step read the notes below
bash INSTALL # this file has been created by 818.sh
./TESTER/test_all # running test
在最后一步中,我还需要编辑
SOFTWARE/Makefile
和INSTALL
文件,并创建TESTER/Makefile.GNU
文件以使用gfortran
作为编译器。最后,我将blas_sparse.mod
文件复制到我的程序所在的目录中。cp SOFTWARE/blas_sparse.mod blas_sparse.mod
现在我可以使用gfortran
编译器编译程序:
gfortran example.F90 -llapack -lblas
blas_sparse_proto.h
)创建一个.mod
文件。 - Maciej K.