即使使用 `-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_' 的未定义引用
有一个acos
或acosd
(度数的反余弦),我快到了,但我无法按照手册中的说明使用-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