使用BIND(C,NAME ="name")属性时,为什么不导出我的fortran函数

ja7*_*a72 2 interop fortran fortran-iso-c-binding intel-fortran

我习惯使用以下语法

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

它在.dll中生成导出的函数 DependencyWalker

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

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

但是没有创建导出功能

DependencyWalker

那我在这里错过了什么?新的如何iso_c_binding取代已弃用的!DEC$ ATTRIBUTE DLLEXPORT声明?

PS.我通过VS2010在Win7-64平台上使用英特尔Fortran XE 2013.

Ian*_*anH 6

正如Hans所说,该过程未导出,因为未要求链接器导出它.

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

至少有三种标记过程的方法,以便在DLL中导出:

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

什么对你最好的取决于...有些人更喜欢有出口的源内文档,有些则认为编译器指令的视觉外观和非标准性质令人无法忍受.