【问题标题】:fortran undefined reference to lnblnk getpid dtime etime [duplicate]fortran 未定义对 lnblnk getpid dtime etime 的引用 [重复]
【发布时间】:2016-03-16 16:37:28
【问题描述】:

我正在尝试移植一些旧的 fortran 代码。它将使用英特尔编译器 ifort 无错误地编译,并且没有警告。 当我尝试使用 gfortran,特别是 4.3.4 和 gfortran-4.8 时,我收到函数 LNBLNK_GETPID_DTIME_ 和 ETIME_ 的未定义引用错误。 我用谷歌搜索了这个问题,似乎 LNBLNK 应该是 gfortran 的内在函数。有人知道解决这个问题的方法吗?

我想我可以编写自己的 LNBLNK 函数,因为它很简单。对于 ETIME 和 DTIME,我可以将它们注释掉,它们不是必需品,但我确实需要 GETPID。

编辑:我在一个 gfortran-4.8 命令上一起编译了 100 多个文件。我只编辑了那些将LNBLNK 提到为未定义引用的文件,并将其替换为LEN_TRIM。这解决了那些未定义的引用错误,但是如果我对所有正在编译的文件执行grep,我会看到至少有 10 个其他文件仍在使用LNBLNK,并且它成功地编译通过了这个特定的undefined reference to LNKBLNK 错误。 什么会导致这个? 这可能是 gfortran 的错误吗?

编辑#2

似乎这样的代码有效:WRITE(6,*) mystring(1:LNBLNK(mystring))

但是,任何使用LNBLNK 命令的文件(如下所示)都会导致编译器错误:

INTEGER LNBLNK
EXTERNAL LNBLNK
INTEGER POS

POS = LNBLNK( mystring )

它会导致这个特定的编译器错误

/tmp/ccsdBgxK.o: In function `whatever_':
whatever.f:(.text+0x38d): undefined reference to `lnblnk_'

【问题讨论】:

  • 对于 Fortran 问题,请始终使用 fortran 来获得高度关注。
  • 如果你想要解释,你应该显示你执行的命令。您还应该显示确切的错误消息。这些函数确实是 gfortran 的内在过程。但是不要使用4.3.4,它太旧了,不能认真使用。
  • 我更新了上面的信息。

标签: fortran linker-errors gfortran


【解决方案1】:

谢谢弗拉德。该链接帮助我解决了 DTIME 和 ETIME 的问题。

在旧代码中它是这样做的,它适用于英特尔 ifort 编译器:

DOUBLE PRECISION DTIME
EXTERNAL DTIME

如果我只是删除EXTERNAL DTIME,那么对于英特尔ifort 编译器和gnu gfortran-4.8,这将解决此函数的特定undefined reference 错误。

但是,对于 gfortran-4.8,我也可以注释掉 DOUBLE PRECISION DTIME,它会编译,但会导致 Intel ifort 编译器出错。如果我注释掉这两个并只使用INTRINSIC DTIME,那么这将适用于 gfortran,但会导致 ifort 出错。

所以解决方案似乎只显式声明函数的返回值,即DOUBLE PRECISON DTIMEINTEGER LNBLNK,绝对不要使用EXTERNALINSTRINSIC 声明。

注意:我对LNBLNK 的解决方案是将其每次出现都替换为LEN_TRIM。并且删除了所有出现的INTEGER LNBLNKEXTERNAL LNBLNK

【讨论】:

    猜你喜欢
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 2011-07-27
    • 2013-06-20
    • 2012-02-05
    相关资源
    最近更新 更多