【问题标题】:F77: problem to compile with g77 a program which was normally compiled with Absoft compilerF77: 使用 g77 编译通常使用 Absoft 编译器编译的程序时出现问题
【发布时间】:2010-07-29 18:18:51
【问题描述】:

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

没有找到。

此外,我遇到另一个问题的同一台机器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:

【问题讨论】:

  • 库的动态链接不依赖于PATH,而是依赖于ldd.confLD_LIBRARY_PATH的内容。

标签: fortran fortran77 gfortran g77


【解决方案1】:

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

因此无法保证您可以在不编辑代码的情况下执行此操作。我似乎记得 Absoft 编译器接受了一种方便的初始化语法,它不能用 g77 复制。

【讨论】:

  • 在源代码中我看到了一些关于g77的注释,并且代码是分发的,所以我得出结论,如果编译人知道他/她在做什么,它可以用g77编译。我的问题是我不知道。我相信解决方案是链接适当的库。
  • @Andrei:啊。这让你在上次 试图这样做的时候更上一层楼……我会留下答案,但我万一有人过来看看谁处于不那么幸福的境地。
【解决方案2】:

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

对于 g77 和 gfortran,它应该不需要 Intel 库——也许 f77 已连接到您计算机上的 ifort,即 Intel 编译器?

稍后编辑:

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

试试这个 FORTRAN 77 程序作为文件“junk.f”

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

试试这个命令:

g77 junk.f -o junk.exe

通过以下方式运行它:

./junk.exe

这将测试g77是否工作。

【讨论】:

  • 对不起,我没有明确写出来,f77 命令链接到g77。我会更新我的问题。如果考虑我的另一个问题,ld 有类似的错误消息,我认为该 Warewulf 集群有些奇怪。
  • 我刚刚尝试使用ifort - 它也找不到libifcore。我猜库路径变量等有问题。
  • 我可以用g77ifort 编译junk.f,这个程序在这两种情况下都可以工作。
【解决方案3】:

您似乎正在尝试与libifcore 链接。

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

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

【讨论】:

  • 我已根据您的回答评论更新了我的问题。你能进一步指导我吗?
  • 你想要 -lifcore 语法会删除 ib,我很确定
  • 是的,他可以按照上面的建议将 libifcore 添加到他的链接中,但我怀疑这是否是整体解决方案。如果用 g77 编译和链接的 Fortran 程序将链接到 Intel Fortran 库是没有意义的。其他库之一是用 ifort 预编译的吗?这可能是链接正在寻找英特尔库的原因。然后,如果您有源代码,最好使用相同的 Fortran 编译器重新编译。或者可能 g77 对这些例程使用相同的名称,而 libifcore 与它无关。
  • 链接器也找不到-lifcore
  • 然后只需将 /opt/intel/fce/9.1.036/lib/libifcore.a 或任何路径放入您的参数列表而不是 -lfcore 或将 -L/opt/intel/fce/9.1.036/lib 添加到您的参数列表
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

    问题似乎在于其中一个源文件中的错误,这对 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 的一个表现非常奇怪,并没有真正做到我想要的。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      • 1970-01-01
      相关资源
      最近更新 更多