0

我以前在更新旧代码时遇到了一些麻烦,这些旧代码仍然需要不受支持的编译器和昂贵的库,以在 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命令可执行文件开始运行。但是,我想要一个解决方案,以便我可以将此可执行文件提供给我的同事,以便他们可以更改输入文件(位于具有可执行文件相对路径的文件夹中)。

进一步了解下面的评论,我尝试了接下来的事情:

  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-folder 中?

当前(半)修复

接下来的事情(有点)对我有用:按照http://gcc.gnu.org/wiki/GfortranBuild/usr/src上的说明在Cygwin 的文件夹中手动构建 libblas.a 和 liblapack.a并在生成文件。更新后的 makefile 可以在这里找到:http: //thijsvandenbrande.be/phd/hamfemInstall/makefileNew

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

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

  • 火腿肠
    • 输入.txt
    • NGCR_building01.txt
  • 出去
    • (例程输出文件的空文件夹)
  • 源代码
    • hamfem.f90(主文件)
    • mainprog.f90(包含来自 lapack 的命令的文件)
    • ...(一堆其他模块)
    • 生成文件
4

1 回答 1

0

我自己想通了,有一些来自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. 检查此存储库中包含的生成文件是否正确链接到库。这些应该说/usr/srcand -static -llapack -lblas,其他选项用于 linux 编译器。

于 2013-07-29T13:21:44.327 回答