3

我不是 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'

我怎样才能解决这个问题?


更新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

没有找到。

此外,我遇到另一个问题是同一台机器如何将 -libm 传递给 MPICC?libimf.so:警告:feupdateenv 未实现且将始终失败

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

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

5 回答 5

2

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

所以不能保证你可以在不编辑代码的情况下做到这一点。我似乎记得 Absoft 编译器接受了一种方便的初始化语法,它不能用 g77 复制。

于 2010-07-29T18:31:36.437 回答
1

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

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

于 2010-08-15T16:29:08.790 回答
1

看起来您正在尝试与 链接libifcore

编辑: 您可以通过在编译器选项中添加“-lifcore”来包含此库。引用gcc 教程

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

于 2010-07-29T18:24:02.673 回答
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

通过以下方式运行它:

./垃圾.exe

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

于 2010-07-29T21:57:11.440 回答
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产生了一些警告。

然后,当我尝试运行这两个二进制文件时,英特尔编译器制作的一个运行良好,但一个 byg77的行为非常奇怪,并没有真正做到我想要的。

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

于 2010-07-30T11:24:19.803 回答