Cygwin 将fortran程序从ubuntu移植到windows的问题

Cygwin 将fortran程序从ubuntu移植到windows的问题,cygwin,static-libraries,gfortran,lapack,blas,Cygwin,Static Libraries,Gfortran,Lapack,Blas,以前,我在更新旧代码时遇到了一些问题,这些代码仍然需要一个不受支持的编译器和昂贵的库,以便在Windows上的Eclipse中使用gfortran。我让它休息了一段时间,最近我采取了一种完全不同的方法,从头开始重建程序,在ubuntu机器上开发,但现在我想把它带回到windows机器上,这样我的同事就可以对它做出贡献 现状: 该程序使用GCC GNU编译器在ubuntu机器上编译、运行并给出良好的结果 Windows 7计算机,64位 使用lapack和liblapack-devel安装Cyg

以前,我在更新旧代码时遇到了一些问题,这些代码仍然需要一个不受支持的编译器和昂贵的库,以便在Windows上的Eclipse中使用gfortran。我让它休息了一段时间,最近我采取了一种完全不同的方法,从头开始重建程序,在ubuntu机器上开发,但现在我想把它带回到windows机器上,这样我的同事就可以对它做出贡献

现状:

  • 该程序使用GCC GNU编译器在ubuntu机器上编译、运行并给出良好的结果
  • Windows 7计算机,64位
  • 使用lapack和liblapack-devel安装Cygwin(用于gnu fortran)(但是,我不使用它们,因为我手动编译blas和lapack)
  • (C:/cygwin/lib已添加到windows路径)
原版:

程序在cygwin中编译(通过调用
make
-命令,使用位于此处的makefile调用make命令:

这将返回文件hamfem.exe,在windows中双击该文件时返回以下错误:
程序无法启动,因为您的计算机中缺少cyglapack-0.dll。请尝试重新安装程序以解决此问题。

从cygwin运行可执行文件时,通过调用
/hamfem.exe
命令,可执行文件开始运行。但是,我需要一个解决方案,以便我可以将此可执行文件提供给我的同事,以便他们可以更改输入文件(位于与可执行文件具有相对路径的文件夹中)

继续下面的评论,我尝试了以下几点:

  • 将确切路径添加到windows路径中的
    C:\cygwin\lib\lapack\cyglapack-0.dll
    文件中,甚至在之后重新启动也无济于事
  • 在调用库之前向makefile添加-static,导致依赖性错误,因为我使用了lapack库的两个命令,它们依赖于大量其他命令(DPBTRF和DPBTRS)。这些命令在mainprog.f90模块中使用。错误:
    /usr/lib/gcc/i686 pc cygwin/4.7.3/../../../liblapack.a(DPBTRF.o):在函数“dpbtrf”中:
    /usr/src/debug/lapack-3.4.2-1/src/dpbtrf.f:277:未定义对“dtrsm”的引用
    
    还有几行说明依赖关系
  • liblapack.a
    文件添加到src文件夹,但编译器总是返回cygwin中的lapack
  • 在lapack网站上,您通常可以下载函数及其依赖项(示例),但这些函数不再可用。有人知道如何将这两个函数及其依赖项包含在静态库文件中,我可以事先编译并添加到
    src
    -文件夹中吗

    当前(半)修复

    下一件事对我起了作用(有点):按照上的说明在Cygwin的
    /usr/src
    文件夹中手动构建libblas.a和liblapack.a,并在makefile中引用此文件夹。更新的makefile可以在以下位置找到:

    通过从cygwin运行make命令(过程的下一步,在Eclipse中运行它),代码在Windows上可以很好地编译我得到了一个.exe文件,可以通过双击它来运行,如果我将它和它的文件夹一起移动到另一个位置,它将继续运行。因为这个过程非常耗时,所以我在下面添加了答案,说明了为了使它工作,您必须解析cygwin的命令

    供您参考:我的文件结构如下所示(生成后,我将.exe文件向上移动一个文件夹,在linux版本和windows版本中都是如此):

    • hamfem.exe
      • input.txt
      • NGCR_building01.txt
    • 出去
      • (例程输出文件的空文件夹)
    • src
      • hamfem.f90(主文件)
      • mainprog.f90(包含lapack命令的文件)
      • …(一系列其他模块)
      • 生成文件

    我用stackoverflow各地的一些指针自己解决了问题。为了让其他人帮助他们解决类似的问题,我希望我的工作方法能在这里完整记录问题

    这个问题可以通过在cygwin中的本地计算机上干净地构建Lapack library!和Blas库,并将liblapack.a和libblas.a文件粘贴到makefile中引用的库文件夹中来解决。通过静态调用Lapack引发的错误,这两个命令中使用了Blas的一些例程

    以下是我遵循的步骤:

  • 从网站下载lapack.tgz和blas.tgz文件,并将其放在
    C:\Cygwin\usr\src
    文件夹中
  • 在cygwin中使用以下命令提取这些文件:

    cd /usr/src 
    tar -xvzf lapack.tgz
    tar -xvzf blas.tgz
    
  • 使用Cygwin中的以下命令构建两个库文件。编译Lapack可能需要一段时间,并且最终会导致一些错误,因为测试文件中缺少一些链接。这些测试是针对准确性工具运行的。需要对
    make.inc
    文件进行更详细的查看,以解决这些问题

    cd $HOME 
    cd /usr/src/BLAS
    make
    mv blas_LINUX.a ../libblas.a
    cd ../lapack-3.4.2
    mv make.inc.example make.inc
    make
    mv liblapack.a ../liblapack.a
    
  • 检查此存储库中包含的makefile,以获得与库的正确链接。这些库应该是
    /usr/src
    -static-llapack-lblas
    ,其他选项适用于linux编译器


  • 你试过让你的同事使用双启动(或者至少是VBox)Ubuntu吗?他们目前在双启动环境中使用以前版本的代码(旧windows环境,只有旧编译器仍然工作的环境)所以基本上我正在寻找一种解决方案,使用cygwin不需要双启动/虚拟环境。在将
    liblapack.a
    放入src文件夹后,您对
    makefile
    做了什么?我删除了文件中对libdir的引用,所以基本上删除了
    -L$(libdir)