我不是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:
答案 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
的那个表现得非常奇怪,并没有真正做我想要的。
所以现在原来的问题已经解决,但是代码不能在多处理模式下运行,所以对于我来说,二进制文件是无用的。