4

我习惯使用以下语法

    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。

4

1 回答 1

9

正如汉斯建议的那样,该过程没有被导出,因为没有要求链接器导出它。

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

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

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

什么对你最好取决于......有些人更喜欢导出的源内文档,其他人发现编译器指令的视觉外观和非标准性质令人难以忍受。

于 2013-12-20T03:52:55.720 回答