Gfortran 将LAPACK与MINGW64一起使用

Gfortran 将LAPACK与MINGW64一起使用,gfortran,lapack,mingw-w64,Gfortran,Lapack,Mingw W64,我正在尝试将LAPACK合并到我试图编译的程序中。我目前正在使用msys2工具链和MINGW64 gfortran编译器。我使用以下过程来获得LAPACK: To get BLAS and LAPACK together In Msys2 64 bit environment type in: Pacman –S mingw-w64-x86_64-cmake #gets cmake Pacman –S git #gets git Git clone https://github.com/msys

我正在尝试将LAPACK合并到我试图编译的程序中。我目前正在使用msys2工具链和MINGW64 gfortran编译器。我使用以下过程来获得LAPACK:

To get BLAS and LAPACK together
In Msys2 64 bit environment type in:
Pacman –S mingw-w64-x86_64-cmake #gets cmake
Pacman –S git #gets git
Git clone https://github.com/msys2/MINGW-packages.git
Cd MINGW-packages/mingw-w64-lapack

Then navigate to ~/MINGW-packages/mingw-w64-lapack and open the file called PKGBUILD.  Do a find and replace all from ‘RESPOSE’ to ‘RESPONSE’.  Save the file and exit the text editor. 

In the msys environment, type:
Makepkg-mingw
Pacman –U mingw-w64-x86_64-lapack*.pkg.tar.gz

BLAS and LAPACK are now installed.

To test lapack, do the following. 

> cd ~
> wget http://www.math.ucla.edu/~wotaoyin/software/lapack_test.cpp  # download
> g++ lapack_test.cpp -llapack -o lapack_test     # build
> ./lapack_test                                   # run
然后我尝试使用LAPACK编译程序。我的程序只调用sgetrf和sgetrs。但是,在编译时,我收到以下错误:

C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/6.2.0/../../../../lib\liblap
ack.a(sgetrf.f.obj):(.text+0x43a): undefined reference to `strsm_'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/6.2.0/../../../../lib\liblap
ack.a(sgetrf.f.obj):(.text+0x524): undefined reference to `sgemm_'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/6.2.0/../../../../lib\liblap
ack.a(sgetrs.f.obj):(.text+0x159): undefined reference to `strsm_'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/6.2.0/../../../../lib\liblap
ack.a(sgetrs.f.obj):(.text+0x1c5): undefined reference to `strsm_'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/6.2.0/../../../../lib\liblap
ack.a(sgetrs.f.obj):(.text+0x340): undefined reference to `strsm_'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/6.2.0/../../../../lib\liblap
ack.a(sgetrs.f.obj):(.text+0x3ac): undefined reference to `strsm_'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/6.2.0/../../../../lib\liblap
ack.a(sgetf2.f.obj):(.text+0x1c3): undefined reference to `isamax_'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/6.2.0/../../../../lib\liblap
ack.a(sgetf2.f.obj):(.text+0x212): undefined reference to `sswap_'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/6.2.0/../../../../lib\liblap
ack.a(sgetf2.f.obj):(.text+0x36c): undefined reference to `sger_'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/6.2.0/../../../../lib\liblap
ack.a(sgetf2.f.obj):(.text+0x3ca): undefined reference to `sscal_'
collect2.exe: error: ld returned 1 exit status
make[1]: *** [Makefile.all:20: avl] Error 1
链接liblapack.a时我遗漏了什么

我的命令是:

gfortran -m64   -o avl  avl.o aoper.o amode.o amass.o asetup.o amake.o ainput.o
aoutput.o aero.o atrim.o atpforc.o aic.o cdcl.o airutil.o autil.o aplotvl.o aplo
ttp.o aplotmd.o limits.o pltops.o hidden.o plsubs.o userio.o plutil.o arrow3d.o
getvm.o matrix.o spline.o sgutil.o second.o -static  ../plotlib/libPlt_mingwSP.a
 ../eispack/libeispack.a -lgdi32 -luser32 -lblas -llapack

我想回答我自己的问题,因为我相信我发现了错误


首先,这些电话似乎与BLAS有关。所以我需要添加-lblas来编译调用。然而,我最初尝试了这个方法,但没有效果,然后在-llapack调用之后调用了-lblas,它成功了

这里是另一个解决方案。从中获取代码。点击链接
lapack.tgz
下载。
make.inc
文件已经设置好(您可能需要重命名它),所以您只需运行
make

我走了好几条死胡同才走到这一步。我按谷歌顺序试过了

  • 给了我四个与gfortran不兼容的文件。也许我看错了网页,但无论如何,如果兼容库在那里,我没有找到它们
  • -下载并解包tar文件会生成与gfortran不兼容的文件
  • -下载并解包
    lapack-3.9.0.tar.gz
    。这是设计用于各种系统的,但不包括mingw gfortran。make文件和其他脚本比我想处理的要复杂得多。在中给出了一个解决方案,但它已存在8年,必须进行更新

  • 你知道,当使用这些标准库变得如此困难时,难怪每个人都放弃了Fortran。Python、Matlab或Octave中也内置了同样的东西

    请看我希望我能了解为什么顺序很重要。我想添加一些评论来帮助其他人,像我一样,不了解gnu的所有特性。我花了很长时间才弄明白如何首先链接这些库,链接到liblapack。不,您必须使用-l lapack。第二个问题是必须在命令行末尾指定库。第三,它们必须按所示顺序链接。这花了很长时间才弄明白。期权的顺序只在gnu世界中起作用。我确信这在某些地方得到了解释,但这不是直觉。“每个人都放弃了Fortran”,这对我和这个标签上的许多其他人来说都是新鲜事。Lapack非常容易安装,并且预装在大多数Linux发行版中。缺少的是Windows生态系统。如果1)中的文件被认为与gfortran不兼容,则必须说明以哪种方式。Lapack不使用任何需要数组描述符或模块的特殊功能。我成功地将MSVC编译代码与gfortran编译库混合在一起。你必须下载正确的版本,而不是英特尔版本。2。“不工作”是什么意思?那么他们用什么工作呢?3.解决方案必须以何种方式更新?拉帕克比那老。具体是什么问题?