好的,我有 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 编译的名为
file.o
的目标文件,并且不知道在哪里可以从 gfortran 运行时库中找到符号。构建脚本没有使用新编译器重新编译此文件。
解决方案是使用特定构建系统的设施,例如
make clean
,删除先前构建生成的所有文件。
我注意到某些构建脚本往往会忽略的
.mod
文件也可能存在问题。