即使使用 `-dec-math`,gfortran 也会对 `dacosd_` 给出未定义的引用

Posted

技术标签:

【中文标题】即使使用 `-dec-math`,gfortran 也会对 `dacosd_` 给出未定义的引用【英文标题】:gfortran gives undefined reference to `dacosd_` even with `-dec-math` 【发布时间】:2017-12-18 05:38:22 【问题描述】:

我正在尝试使用 gfortran 编译 Fortran 应用程序,并与英特尔 MKL 库链接。

对 `dacosd_' 的未定义引用

有一个acosacosd(度数的反余弦),我快到了,但我无法按照手册中的说明使用-fall-intrinsics-dec-math 标志进行编译,因为这一切产生同样的错误。

我哪里弄错了,我该如何编译?

我使用的gfortran 版本是5.4.1。

【问题讨论】:

我不认为 acosd 和朋友可用于旧版本的编译器。检查该特定版本的文档。无论如何,我都会避开它,因为它不是标准的。只需定义一个等于180.0/pi 的参数,以您喜欢的任意精度乘以。 您还在使用-std=2008吗?说 complete 命令很重要!如果没有其他人早点找到答案,我稍后会寻找答案,但请注意手册中的内容:“此功能仅用于兼容性,应尽可能避免使用标准构造。” 你可以只使用 acos() 并按照 RussF 所说的那样转换参数。他也可能是对的,您需要更新的版本。 顺便说一句,我相信是-fdec-math,而不是-dec-math 【参考方案1】:

正如 RussF 所评论的,这些非标准扩展函数包含在 gfortran 7 及更高版本中。您需要更新的版本。另外,正确的标志是-fdec-math,而不是-dec-math

intrinsic dacosd

print *, dacosd(0.5d0)
end

编译为:

> gfortran-6 -fdec-math dacosd.f90 
gfortran-6: error: unrecognized command line option ‘-fdec-math’; did you mean ‘-ffast-math’?
> gfortran-7 -fdec-math dacosd.f90
> ./a.out 
   60.000000000000007     

您可以通过转换轻松地进行相同的计算

double precision, parameter :: pi = acos(-1.d0)
print *, acos(0.5d0)*180/pi
end

或者您可以通过这种方式定义自己的 (d)acosd 函数,以保持便携性。

【讨论】:

天哪,它真的奏效了!我在 ubuntu 上安装了 gfortran-7(由于某些原因,默认的 gfortran 版本保持低至 5.4.0,因此您必须手动更新/升级它)。在那里获得intrinsic 真的可以帮助我解决问题!非常感谢,节日快乐!

以上是关于即使使用 `-dec-math`,gfortran 也会对 `dacosd_` 给出未定义的引用的主要内容,如果未能解决你的问题,请参考以下文章

gfortran中对`sleep`和`sizeof` instrinsics的未定义引用

不能在Ubuntu上使用gfortran和Abaqus 2016

使用 GCC 和 GFORTRAN 进行矢量化

我可以为 gfortran 使用哪些 gcc 编译器选项

gfortran 中的 ieee_arithmetic 内在模块

编译使用带有gfortran的英特尔MKL模块的代码