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

时间:2013-07-25 21:42:58

标签: cygwin static-libraries gfortran lapack blas

我以前遇到过一些麻烦,更新旧代码仍然需要一个不受支持的编译器和昂贵的库到Windows上的Eclipse中带有gfortran的版本。我让它休息了一段时间,最近我采取了另一种方法,从头开始重建程序,在ubuntu机器上开发,但现在我想把它带回一台Windows机器,以便我的同事可以为它做出贡献。

状态:

  • 程序在使用GCC GNU编译器的ubuntu机器上编译,运行并提供良好的结果
  • Windows 7计算机,64位
  • 使用lapack和liblapack-devel的Cygwin安装(对于gnu fortran)(但是,我不使用这些,因为我手动编译blas和lapack)
  • (C:/ cygwin / lib添加到windows Path)

原始问题:

程序在cygwin中编译(通过调用make - 命令,使用位于此处的makefile调用make命令:http://thijsvandenbrande.be/phd/hamfemInstall/makefile

这会返回文件hamfem.exe,它在windows中双击它时会返回以下错误:The program can't start because cyglapack-0.dll is missing from your computer. Try reinstalling the program to fix this problem.

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

继续下面的评论,我尝试了下一步:

  1. 在Windows路径中添加C:\cygwin\lib\lapack\cyglapack-0.dll文件的确切路径,甚至之后重新启动也无济于事。
  2. 在调用库之前向makefile添加-static,导致依赖性错误,因为我使用了依赖于很多其他命令(DPBTRF和DPBTRS)的lapack库的两个命令。这些命令在mainprog.f90模块中使用。错误:/usr/lib/gcc/i686-pc-cygwin/4.7.3/../../../liblapack.a(dpbtrf.f.o): In function 'dpbtrf': /usr/src/debug/lapack-3.4.2-1/SRC/dpbtrf.f:277: undefined reference to 'dtrsm_' 以及另外两行说明依赖项。
  3. liblapack.a文件添加到src文件夹,但编译器总是返回到cygwin中的lapack
  4. 在lapack的网站上,您通常可以下载带有依赖项的函数(例如DPBTRF),但这些函数不再可用。有没有人有另一个想法如何将这两个函数及其依赖项包含在我可以预先编译并添加到src - 文件夹的静态库文件中?

    当前(半)修复

    下一件事对我来说有点工作:按照http://gcc.gnu.org/wiki/GfortranBuild上的说明在Cygwin的/usr/src文件夹中手动构建libblas.a和liblapack.a并引用此文件夹中的makefile文件。可以在此处找到更新的makefile:http://thijsvandenbrande.be/phd/hamfemInstall/makefileNew

    代码通过从cygwin运行make命令在Windows上很好地编译(在该过程的下一步,从Eclipse运行它),我得到一个.exe文件,可以通过双击运行,如果我继续运行将其文件夹移动到另一个位置。因为这个过程是非常耗费人力的,所以要把它全部搞清楚,我在下面添加了答案,说明你必须解析到cygwin的命令才能使它工作。

    供您参考:我的文件结构如下所示(在构建之后,我将.exe文件移动到一个文件夹,在Linux版本中作为Windows版本):

    • hamfem.exe
      • input.txt中
      • NGCR_building01.txt
      • (例程输出文件的空文件夹)
    • SRC
      • hamfem.f90(主档案)
      • mainprog.f90(包含来自lapack的命令的文件)
      • ...(一堆其他模块)
      • 生成文件

1 个答案:

答案 0 :(得分:0)

我自己想出了一些东西,并提供了来自堆栈溢出的一些指针。为了让其他人帮助他们解决类似问题,我希望我的工作方法能够完整记录下来。

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

这是我遵循的步骤:

  1. 从网站下载lapack.tgz和blas.tgz文件,然后将它们放在C:\Cygwin\usr\src文件夹
  2. 使用cygwin中的以下命令提取这些文件:

    cd /usr/src 
    tar -xvzf lapack.tgz
    tar -xvzf blas.tgz
    
  3. 使用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
    
  4. 检查此存储库中包含的makefile是否正确链接到库。这些应该说/usr/src-static -llapack -lblas,其他选项适用于linux编译器。