【问题标题】:Use of IFDEF for giving an attribute使用 IFDEF 赋予属性
【发布时间】:2016-12-06 12:55:26
【问题描述】:

我在生成动态库(Windows 中的 DLL,Linux 中的 SO)的 .f90 文件中有以下工作情况:

#ifdef __linux__
    subroutine FCCORR (i1,i2) bind(c, name='FCCORR')
    use, intrinsic :: iso_c_binding
#endif
!
#ifdef _WIN32
    subroutine FCCORR (i1,i2)
    !DEC$ ATTRIBUTES DLLEXPORT, DECORATE, ALIAS : "FCCORR" :: FCCORR
    !DEC$ ATTRIBUTES REFERENCE :: i1,i2
#endif
!
integer, intent(in)  :: i1
integer, intent(out) :: i2
!
i2 = i1*3
!
end subroutine

我想知道在两种不同情况下是否可以避免子例程的分离:特别是我想知道是否可以使用#ifdef 仅附加bind 属性,如下所示:

subroutine FCCORR (i1,i2)
#ifdef __linux__
    bind(c, name='FCCORR')
    use, intrinsic :: iso_c_binding
#endif
!
#ifdef _WIN32
    !DEC$ ATTRIBUTES DLLEXPORT, DECORATE, ALIAS : "FCCORR" :: FCCORR
    !DEC$ ATTRIBUTES REFERENCE :: i1,i2
#endif
!
integer, intent(in)  :: i1
integer, intent(out) :: i2
!
i2 = i1*3
!
end subroutine

但显然第 3 行会产生错误:

(error #5082: 语法错误,在期望 END-OF-STATEMENT 时发现 的: :: / 绑定(c, name='TEST')

【问题讨论】:

  • 你试过#ifdef(s)里面的SUBROUTINE吗?
  • 这不是 Fortran 90,标记已删除。
  • @Holmz 确定他做到了,请参阅问题中的第一个代码块。

标签: dll fortran


【解决方案1】:

嗯,这是可能的,但你必须使用 Fortran 规则来续行

subroutine FCCORR (i1,i2) &
#ifdef __linux__
    bind(c, name='FCCORR')

问题是您也需要在 Windows 情况下以某种方式继续该行,而我看不到任何选项。

但我不明白你为什么不能在 Windows 中使用 bind(C) 属性。

顺便说一句,我绝对看不出你为什么使用use, intrinsic :: iso_c_binding,因为代码中没有对模块的引用。如果代码需要它,那么 Windows 版本也需要它。

【讨论】:

  • 感谢您的提示,您完全正确;实际上我不需要iso_c_binding,而在Windows 中我需要!DEC$ ATTRIBUTES DLLEXPORT,所以我不能使用bind(C)。我使用!DEC$ ATTRIBUTES DECORATE, ALIAS "TEST" :: TEST for Linux 和!DEC$ ATTRIBUTES DLLEXPORT, DECORATE, ALIAS "TEST" :: TEST for Windows 解决了。感谢您的帮助
  • 据我所知!DEC$ ATTRIBUTES DLLEXPORT可以和bind(C)结合使用。
  • 你又是对的,bind(C) 不能与ALIASDECORATE 结合使用...顺便说一句,我已经通过绕行解决了,就像我上面写的.. . 我应该删除问题吗?
  • 一旦您接受了一个问题,如果您不接受并删除该问题,您可能会受到处罚。系统不喜欢。
  • 但是最后的决定权在你,只是需要注意meta.stackoverflow.com/a/287903/721644 “最后,值得注意的是删除问题对问题禁令有很大影响的特殊情况:在之后立即删除它们有人发布了答案。” 也许等一段时间……
猜你喜欢
  • 2020-11-11
  • 1970-01-01
  • 2012-12-03
  • 2015-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-13
  • 2014-12-23
相关资源
最近更新 更多