【问题标题】:Why aren't my fortran functions exported when using the BIND(C, NAME="name") attribute为什么使用 BIND(C, NAME="name") 属性时我的 fortran 函数没有导出
【发布时间】:2013-12-19 14:30:46
【问题描述】:

我习惯使用下面的语法

    subroutine CalcA(A,N)
    !DEC$ ATTRIBUTES DLLEXPORT :: CALCA
    !DEC$ ATTRIBUTES ALIAS:'CalcA' :: CalcA
    IMPLICIT NONE        
    ...
    end subroutine CalcA

在 .dll 中生成导出函数

所以现在我正在使用以下代码尝试新的ISO_C_BINDING

    subroutine CalcA(A,N) BIND(C, NAME="CalcA")
    USE, INTRINSIC :: ISO_C_BINDING
    IMPLICIT NONE        
    ...        
    end subroutine CalcA

但是没有创建导出函数

那么我在这里遗漏了什么?新的iso_c_binding 将如何替换已弃用的!DEC$ ATTRIBUTE DLLEXPORT 声明?

PS。我通过 VS2010 在 Win7-64 平台上使用 Intel Fortran XE 2013。

【问题讨论】:

  • 我会在英特尔支持论坛上提问。
  • 这里一定有人知道..我希望。
  • ISO_C_BINDING 只是没有做你希望它做的事情。它添加了几个预定义的常量和过程,可帮助您与 C 代码进行互操作。它不会自动导出函数,您仍然必须使用 DLLEXPORT 属性。
  • 我明白了。把它放在答案中,我会奖励它。谢谢。
  • 我没有说没人会知道我只是说我会在供应商的官方支持论坛上询问,仅此而已。否则为什么要支付支持费用?

标签: interop fortran fortran-iso-c-binding intel-fortran


【解决方案1】:

正如 Hans 所暗示的,该过程没有被导出,因为没有要求链接器导出它。

BIND 子句中的绑定标签(ISO_C_BINDING 模块与讨论无关)实际上设置了过程的“链接器名称”(类似于 ATTRIBUTES ALIAS 所做的),并且这样做的方式与 C 一致. BIND 子句还将调用约定设置为与 C 兼容(类似于 ATTRIBUTES C)。 BIND 子句的集体效应还包括 ATTRIBUTES DECORATE 的集体效应(集体编译器指令属性和我没有考虑过的子句之间可能存在其他细微差别)。

至少有三种方法可以标记一个过程以便将其导出到 DLL 中:

  • 包含过程的目标文件中的条目(这是 ATTRIBUTES DLLEXPORT 与 ifort 一起使用的方式)。
  • 在链接时传递给链接器的模块定义文件 (.DEF) 的 EXPORTS 部分中的条目。
  • 链接器本身的命令链接参数 (/EXPORT:xxx)。

什么对您最好取决于...有些人更喜欢在源代码中提供导出文档,而另一些人则认为编译器指令的视觉外观和非标准性质令人难以忍受。

【讨论】:

  • 感谢您深思熟虑的解释。
猜你喜欢
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
  • 1970-01-01
  • 2022-07-29
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
相关资源
最近更新 更多