Fortran F77:使用g77编译通常使用Absolft编译器编译的程序时出现问题

Fortran F77:使用g77编译通常使用Absolft编译器编译的程序时出现问题,fortran,fortran77,gfortran,g77,Fortran,Fortran77,Gfortran,G77,我不是Fortran程序员(只是一段短暂的经验),但我需要编译一个部分用F77编写的程序。在我之前,有人用Absoft编译器编译过它,但现在我需要用g77在另一台机器上重复这个过程。对于Absolft,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/

我不是Fortran程序员(只是一段短暂的经验),但我需要编译一个部分用
F77
编写的程序。在我之前,有人用
Absoft
编译器编译过它,但现在我需要用
g77
在另一台机器上重复这个过程。对于Absolft,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'
我怎样才能解决这个问题


更新1

如果我将
-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
没有找到它

而且,这是我遇到另一个问题的同一台机器

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

$ 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:

看起来您正试图链接到
libifcore

编辑: 您可以通过添加 “-lifcore”添加到编译器选项。引用

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


Absolft接受了Fortran 77的扩展版本,该版本与77国集团接受的Fortran 77的扩展版本不完全兼容


因此,不能保证不编辑代码就可以做到这一点。我似乎还记得Absolft编译器接受了一种方便的初始化语法,这是g77无法复制的。

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

有了g77和gfortran,它应该不需要英特尔库——也许f77已连接到您计算机上的英特尔编译器ifort

稍后编辑:

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

以文件“junk.f”的形式尝试此FORTRAN 77程序

请尝试以下命令:

g77 junk.f-o junk.exe

通过以下方式运行:

/junk.exe


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

问题似乎出在一个源文件中的错误,这对Absolft编译器来说不是什么大问题
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
产生了许多警告

然后,当我尝试运行这两个二进制文件时,Intel comiler制作的一个运行得很好,但77国集团制作的一个运行得非常奇怪,并没有真正做到我想要的


现在,原来的问题解决了,但是代码没有在多处理模式下运行,因此二进制文件对我来说很不幸是无用的。

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


您可以将openmp与gfortran编译器一起使用,当您希望像ifort编译器一样使用矢量模式时,必须在编译器选项中显式指定sse

在源代码中,我看到了一些关于77国集团的注释,代码已经分发,因此我得出结论,如果编译人员知道他/她在做什么,它可以用77国集团编译。我的问题是我不知道。我相信解决办法是连接适当的库。@Andrei:啊。这让你在上次我试着这么做的时候想起了。。。如果有人来找我,我会留下我的答案。我已经根据你的回答更新了我的问题。你能进一步指导我吗?你想-lifcore语法会删除ib,我很确定是的,他可以按照上面的建议将libifcore添加到他的链接中,但我怀疑这是否是整体解决方案。如果用77国集团编译和链接的Fortran程序链接到英特尔Fortran库是没有意义的。是否有其他库使用ifort预编译?这可能是链接正在查找英特尔库的原因。如果您有源代码,最好使用相同的Fortran编译器重新编译。或者g77对这些例程使用相同的名称,而libifcore与之无关。链接器也找不到
-lifcore
。然后只需将
/opt/intel/fce/9.1.036/lib/libifcore.a
或任何指向参数列表的路径而不是-lfcore,或者在参数中添加
-L/opt/intel/fce/9.1.036/lib
列表很抱歉,我没有明确编写,
f77
命令链接到了
g77
。我会更新我的问题。我认为如果WordWulf集群有一个奇怪的问题,那就是用类似的错误信息来考虑我的另一个问题:<代码> LD 。我只是尝试使用<代码> Ifter < /C> >它也没有找到<代码> LiBiBux。我猜库路径变量等有问题。我可以同时使用
g77
ifort
编译
junk.f
,该程序在这两种情况下都能运行。库的动态链接不依赖于
path
,而是依赖于
ldd.conf
LD\u library\u path
的内容。
fortcom: Error: somefile.f, line 703: An extra comma appears in the format list.   [)]
     & (1p5e12.3,5h  ...,))                                             
-------------------------^
compilation aborted for somefile.f (code 1)