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

 七城赣州击剑_966 发布于 2023-02-09 11:04

我习惯使用以下语法

    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平台上使用英特尔Fortran XE 2013.

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

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

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

    保存过程的目标文件中的条目(这是ATTRIBUTES DLLEXPORT如何与ifort一起使用).

    模块定义文件(.DEF)的EXPORTS部分中的条目,在链接时传递给链接器.

    命令链接器本身的链接参数(/ EXPORT:xxx).

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

    2023-02-09 11:07 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有