【问题标题】:Problems with porting a fortran program from ubuntu to windows将 fortran 程序从 ubuntu 移植到 windows 的问题
【发布时间】:2013-07-26 00:16:17
【问题描述】:

我以前在将旧代码更新为 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-command,使用位于此处的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 命令可执行文件开始运行。但是,我想要一个解决方案,以便我可以将此可执行文件提供给我的同事,以便他们可以更改输入文件(位于具有可执行文件相对路径的文件夹中)。

在下面的 cmets 上更进一步,我尝试了接下来的事情:

  1. 在 windows 路径中添加 C:\cygwin\lib\lapack\cyglapack-0.dll 文件的确切路径,甚至在之后重新启动也无济于事。
  2. 在调用库之前向 makefile 添加 -static 会导致依赖性错误,因为我使用了 lapack 库的两个命令,它们依赖于相当多的其他命令(DPBTRF 和 DPBTRS)。这些命令在 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

在 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 命令(过程的下一步,从 Eclipse 中运行它),代码在 Windows 上编译得很好,我得到一个 .exe 文件,可以通过双击它来运行它,如果我继续运行将其与其文件夹一起移动到另一个位置。因为这个过程非常耗费人力,所以我在下面添加了答案,说明了你必须解析到 cygwin 才能使其工作的命令。

供您参考:我的文件结构如下所示(构建后,我将 .exe 文件上移了一个文件夹,在 linux 版本中都作为 windows 版本):

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

【问题讨论】:

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

标签: cygwin static-libraries gfortran lapack blas


【解决方案1】:

我自己想通了,有一些来自stackoverflow的指针。为了让其他人帮助他们解决类似的问题,我想在这里使用我的工作方法,以便完整记录问题。

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

这些是我遵循的步骤:

  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 编译器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多