F77:用g77编译一个通常用Absoft编译器编译的程序的问题

时间:2010-07-29 18:18:52

标签: fortran fortran77 gfortran g77

我不是Fortran程序员(只是一个简短的经历),但我需要编译部分用F77编写的程序。有人在我之前使用Absoft编译器编译了它,但现在我需要在g77的另一台机器上重复该过程。对于Absoft,makefile有

f77 -f  -w -O -B100 -B108 -c *.f
mv *.f flib && mv *.o olib
f77  -B100 -o runme olib/*.o clib/*.o -L/usr/X11R6/lib64 -L/usr/X11R6/lib -lX11 -L$PVM_ROOT/lib/$PVM_ARCH  -lfpvm3 -lpvm3 -L$ABSOFT/lib -lU77

我已将这些行修改为

g77   -w -O -B100 -B108 -c *.f
mv *.f flib && mv *.o olib
g77  -B100 -o runme olib/*.o clib/*.o -L/usr/X11R6/lib64 -L/usr/X11R6/lib -lX11 -L$PVM_ROOT/lib/$PVM_ARCH  -lfpvm3 -lpvm3  -lgfortran -lgfortranbegin

但是我收到以下错误消息

somefile.f:(.text+0x93): undefined reference to `for_open'
somefile.f:(.text+0xf4): undefined reference to `for_write_seq_fmt'
somefile.f:(.text+0x128): undefined reference to `for_write_seq_fmt_xmit'
somefile.f:(.text+0x454): undefined reference to `for_read_seq'

我该如何解决这个问题?


UPDATE1

如果我将-libifcore添加到最后一行(链接器)的末尾,那么我得到

/usr/bin/ld: cannot find -libifcore

我找到了图书馆

$ find /opt/intel/* -name 'libifcore*'
/opt/intel/fce/9.1.036/lib/libifcore.a
/opt/intel/fce/9.1.036/lib/libifcore.so
/opt/intel/fce/9.1.036/lib/libifcore.so.5
/opt/intel/fce/9.1.036/lib/libifcore_pic.a
/opt/intel/fce/9.1.036/lib/libifcoremt.a
/opt/intel/fce/9.1.036/lib/libifcoremt.so
/opt/intel/fce/9.1.036/lib/libifcoremt.so.5
/opt/intel/fce/9.1.036/lib/libifcoremt_pic.a

但即使我在源目录中执行以下操作

$ export PATH=$PATH:/opt/intel/fce/9.1.036/lib/
$ ln -s /opt/intel/fce/9.1.036/lib/libifcore.so

没找到。

此外,它与我遇到另一个问题How to pass -libm to MPICC? libimf.so: warning: feupdateenv is not implemented and will always fail

的机器相同

如果需要,编译器似乎应该找到库

$ echo $LD_LIBRARY_PATH
/opt/intel/fce/9.1.036/lib:/opt/intel/cce/9.1.042/lib:/usr/local/lib/openmpi:/usr/local/lib:/usr/lib:

5 个答案:

答案 0 :(得分:2)

Absoft接受了Fortran 77的扩展版本,该版本与g77接受的Fortran 77的扩展版本不完全兼容。

因此,无法保证可以执行此操作而无需编辑代码。我似乎记得Absoft编译器接受了一个无法用g77复制的方便的初始化语法。

答案 1 :(得分:1)

您似乎正在尝试与libifcore建立关联。

修改 您可以通过添加来包含此库 '-lifcore'到您的编译器选项。引用gcc tutorial

  

通常,编译器选项-lNAME将尝试将目标文件与标准库目录中的库文件“libNAME.a”链接。

答案 2 :(得分:1)

如果你想编译&使用g77链接,最简单的方法是使用命令“g77”。 (f77在您的计算机上调用了什么编译器?尝试“f77 -v”或类似的查找...)它应该自动找到g77 Fortran特定的库。您不需要显式链接到Fortran库,尤其不需要链接到gfortran的库,这是一个不同的编译器。你也可以编译&链接与gfortran - 它可能会认识到源代码是Fortran 77并且如果文件具有正确的文件类型则适当编译,否则你将不得不使用选项 - 对于这个编译器,使用命令“gfortran”。

使用g77和gfortran它不需要英特尔库 - 也许f77连接到你的计算机上的ifort,英特尔编译器?

稍后编辑:

我建议先尝试更简单的方法来测试你的设置。

尝试将此FORTRAN 77程序作为文件“junk.f”

C234567
      write (6, *) "Hello World"
      stop
      end

尝试此命令:

g77 junk.f -o junk.exe

通过以下方式运行:

./ junk.exe

这将测试g77是否正常工作。

答案 3 :(得分:1)

为什么你使用g77而不是gfortran? 多处理是什么意思? openmp还是矢量化?

你可以将openmp与gfortran编译器一起使用,当你想像ifort编译器那样使用向量模式时,你必须在编译器选项中明确指定sse。

答案 4 :(得分:0)

似乎问题出现在其中一个源文件中,这对于Absoft编译器来说并不是什么大问题。 g77正在发出警告,但是编译此文件并在没有二进制文件的情况下产生原始错误(在问题中提到)。

当我尝试ifort时,该文件的编译被中止,但编译了其他文件并创建了二进制文件。

fortcom: Error: somefile.f, line 703: An extra comma appears in the format list.   [)]
     & (1p5e12.3,5h  ...,))                                             
-------------------------^
compilation aborted for somefile.f (code 1)

当我删除额外的逗号时,两个编译器都编译了所有内容并创建了二进制文件,尽管ifort产生了许多警告。

然后,当我尝试运行这两个二进制文件时,英特尔编译器制作的那个二进制文件工作正常,但g77的那个表现得非常奇怪,并没有真正做我想要的。

所以现在原来的问题已经解决,但是代码不能在多处理模式下运行,所以对于我来说,二进制文件是无用的。