【问题标题】:Program compiled with gfortran, how to recompile with ifort?用gfortran编译的程序,如何用ifort重新编译?
【发布时间】:2014-03-07 17:13:43
【问题描述】:

好的,我有一个 Linux HPC 上的大型开源程序的源代码。有两个不同的系统构成 HPC,arc1 和 arc2,它们共享一个文件系统。本质上,我需要这个程序的两个单独编译的版本,因为这两个系统有不同的库和编译器版本等。但是,我希望能够从相同的源代码编译这两个版本。

我遇到的问题是,一旦我用特定的编译器编译了一次代码,它似乎就被那个特定的编译器“锁定”了。当我尝试随后使用不同的编译器重新编译时,即使在同一个系统上,它也会给我很多形式的错误:

[file.o]:[line]: undefined reference to '_gfortran_****'

其中**** 是许多不同的内置 Fortran 函数。我不得不承认我对编译器的实际工作原理知之甚少,所以我无法解释这一点。

所以,我的问题归结为两个主要问题:

1) gfortran 版本之间的“未定义引用”错误是否有任何快速修复?该代码最初是在 arc1 上使用 gfortran 4.1.2 编译的,我正在尝试在 arc2 上使用 gfortran 4.4.7 编译它。

2) 如果没有,有什么方法可以“解锁”代码,以便我可以在两个系统上使用 ifort 重新编译它(因为两个系统都安装了相同版本的 ifort)?目前,当我尝试在任一系统上使用 ifort 编译它时,都会引发数千个“未定义引用”错误。

【问题讨论】:

  • 你确定你用 gfortran 编译你在代码中使用的每个库吗?
  • 我不这么认为,该程序主要使用 Fortran,但我认为一些图形位和 bobs 使用 C++。安装脚本被限制为使用 Fortran 和 C++ 编译器的同义版本。
  • 显然有一些链接的目标文件是由 gfortran 编译的。链接器通常会打印文件名。我相信是file.o
  • 所以我需要在尝试重新编译之前手动重新生成目标文件吗?我以为安装脚本会自动执行此操作。
  • 如果你把它复制到别的地方就不行了。

标签: compiler-construction compilation fortran gfortran intel-fortran


【解决方案1】:

cmets 的总和。链接器清楚地接收到由 gfortran 编译的名为 file.o 的目标文件,并且不知道在哪里可以找到 gfortran 运行时库中的符号。构建脚本没有用新的编译器重新编译这个文件。

解决方案是使用特定构建系统的工具,例如make clean,删除之前构建生成的所有文件。

我注意到.mod 文件也可能存在一些构建脚本倾向于忽略的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多