【问题标题】:Issue compiling with f77 on OSX 10.11在 OSX 10.11 上使用 f77 编译问题
【发布时间】:2016-05-15 23:37:20
【问题描述】:

我一直在尝试运行这个模型,它是几十年前由其他人编写的。我已经构建了库,但是当我尝试实际运行程序时,出现以下错误:

f77   -o mimics1.5  ../source/*.o  trunk_hght_f.f 
    trunk_hght_f.f:
       trunk_hght_func:
    Undefined symbols for architecture x86_64:
      "MAIN__", referenced from:
         -u command line option
         (maybe you meant: _MAIN__)
    ld: symbol(s) not found for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)

我在 MacOSX 10.11 上,which f77 回馈 /usr/local/bin/f77f77 -v 回馈:

Cynthias-MacBook-Pro-2:input_dir cynthiag$ f77 -v    
/usr/local/bin/f77 script based on f2c:
    f2c (Fortran to C Translator) version 20100827.

应该f77 改为/usr/bin/吗?

ld 似乎是问题所在,所以我按照HERE 的指示尝试解决它,但看起来我的 XCode 是最新的,我的库已构建和链接(尽我所能告诉),我什至重新安装了binutils 以确保ld 位于正确的位置,但没有成功。 which ld 给出:/usr/bin/ldld -v 给出:

Cynthias-MacBook-Pro-2:input_dir cynthiag$ ld -v
@(#)PROGRAM:ld  PROJECT:ld64-264.3.102
configured to support archs: armv6 armv7 armv7s arm64 i386 x86_64 x86_64h armv6m armv7k armv7m armv7em (tvOS)
LTO support using: LLVM version 7.3.0

我是fortran 的新手,所以我在设置f77 时可能搞砸了,但是我已经被这个问题困扰了几天,所以非常感谢任何帮助!

【问题讨论】:

  • 如果您的源代码没有 PROGRAM 过程(在 f77 之前,没有 FUNCTION 或 SUBROUTINE 标题的过程),您将需要修复它。其次,使用 gfortran 应该比 20 年前的 f77 翻译器更容易使用。
  • @tim18:不完全确定您的评论第一部分是什么意思,但自述文件告诉我运行一个runit 文件。这就是给我这个错误的原因。我也切换到使用 gfortran,完全相同的错误。
  • @roygvib:我使用gfortran 上的信息编辑了问题。一个简单的hello world 程序可以正常工作。运行您建议的行时,我收到一个关于一堆重复项的新错误类型,并以:ld: 19 duplicate symbols for architecture x86_64 collect2: error: ld returned 1 exit status...
  • @roygvib:我已将所有对f77 的调用更改为gfortran,并在我的bash 配置文件中创建了一个别名。副本实际上是奇怪的文件:duplicate symbol _set_flag_ in: /var/folders/n0/0df9sk4934q632rhr5dqcv0h0000gn/T//ccHPHth6.o /var/folders/n0/0df9sk4934q632rhr5dqcv0h0000gn/T//cc0ZazUC.o 它们不是我库的一部分,我只是全新安装了模型,同样的问题。
  • 所以我认为它只是编译!关于副本的错误来自您建议的行,但运行实际的代码行似乎已经成功了:gfortran -o mimics1.5 ../source/*.o trunk_hght_f.f。现在不幸的是,我实际上不确定是什么让它工作......我认为这是全新安装 + 仔细更改所有 f77 提及 + 在可执行文件前面添加一些 ./。我有点沮丧,因为我不完全确定它到底做了什么……

标签: linker fortran clang fortran77 binutils


【解决方案1】:

最后,我的解决方案似乎只是使用gfortran 而不是f77。这涉及小心地将模型中(即所有 Makefile)中的所有提及项切换为 f77,并将它们替换为 gfortran

然后需要对库进行全新安装,因为显然在f77 中编译的库将与gfortran 不兼容。

最后,模型调用了一些没有./ 的可执行文件,导致模型失败。

很遗憾,我无法解释 f77 失败的原因,但 gfortran 比 f77/f2c 更容易设置并且运行良好,所以它可能是要走的路。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 2014-06-20
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多