gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:36:39 26 4
gpt4 key购买 nike

我习惯使用以下语法

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

在 .dll 中生成导出函数
DependencyWalker

所以现在我正在尝试新的 ISO_C_BINDING 使用以下代码
    subroutine CalcA(A,N) BIND(C, NAME="CalcA")
USE, INTRINSIC :: ISO_C_BINDING
IMPLICIT NONE
...
end subroutine CalcA

但是没有创建导出功能

DependencyWalker

那么我在这里错过了什么? 新的 iso_c_binding怎么样将替换已弃用的 !DEC$ ATTRIBUTE DLLEXPORT声明?

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

最佳答案

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

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

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

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

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

    关于interop - 为什么使用 BIND(C, NAME ="name") 属性时我的 fortran 函数没有导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20684297/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com