Compaq Visual Fortran 6.6、Dynamic-Link 库 (DLL) 和模块

Compaq Visual Fortran 6.6, Dynamic-Link Library (DLL) and Module

我需要为使用 Compaq Visual Fortran 6.6 的 Fortran 应用程序创建和使用动态-link 库 (DLL)。以下代码工作正常:

PROGRAM AMAIN1
IMPLICIT NONE
REAL(8):: A,B,S
A = 1D0
B = 2D0
CALL SUBRO1(A,B,S)
PRINT*, 'S = ', S
END PROGRAM AMAIN1

SUBROUTINE SUBRO1(A,B,S)
!DEC$ ATTRIBUTES DLLEXPORT :: SUBRO1
IMPLICIT NONE
REAL(8):: A,B,S
S = A + B
RETURN
END SUBROUTINE SUBRO1

结果正确: 小号 = 3.00000000000000 按任意键继续

但是,如果我使用该模块实现相同的算法,我会得到不一致的结果(即零):

PROGRAM AMAIN2
USE MODUL2
A = 1D0
B = 2D0
CALL SUBRO2
PRINT*, 'S = ', S
END PROGRAM AMAIN2

MODULE MODUL2
IMPLICIT NONE
REAL(8):: A,B,S
END MODULE MODUL2

SUBROUTINE SUBRO2
!DEC$ ATTRIBUTES DLLEXPORT :: SUBRO2
USE MODUL2
S = A + B
RETURN
END SUBROUTINE SUBRO2

结果不正确: S = 0.000000000000000E+000 按任意键继续

如上所示,DLL 在这两种情况下(分别为 SUBRO1 和 SUBRO2)都只包含子程序。我已经从可视化开发环境构建了 DLL 和 LIB 文件。第二种情况(使用模块)代表了我的大型源代码的结构,所以我需要解决这个问题。任何建议将不胜感激。

顺便说一句,不使用 DLL 的相同算法运行良好并给出正确的结果:

PROGRAM AMAIN3
USE MODUL3
A = 1D0
B = 2D0
CALL SUBRO3
PRINT*, 'S = ', S
END PROGRAM AMAIN3

MODULE MODUL3
IMPLICIT NONE
REAL(8):: A,B,S
END MODULE MODUL3

SUBROUTINE SUBRO3
USE MODUL3
S = A + B
RETURN
END SUBROUTINE SUBRO3

结果正确: 小号 = 3.00000000000000 按任意键继续

您需要添加:

!DEC$ ATTRIBUTES DLLEXPORT :: A,B,S

到module,这样主程序就可以从DLL中看到module变量。否则 A、B 和 S 是局部变量。

编辑:2019 年 1 月 16 日

我能够登录 Bakhbergen 的电脑并最终解决了问题。

在 CVF 6.6C(以及后来的 Intel 编译器)中,当您使用具有 DLLEXPORT 指令的 module 时,它​​会变成 DLLIMPORT,因此我在上面提出了建议。但它并不总是这样,他的版本没有这种行为。在那次更改之前(我的记忆说我游说),您必须提供单独编译的 .mod,其中源具有 DLLIMPORT 而不是 DLLEXPORT。当我这样做时,程序运行了。我不记得具体是哪个更新有这个变化。

所以他需要做的是拥有两个版本的 MODUL2.f90,一个带有 DLLEXPORT,一个带有 DLLIMPORT。 DLLEXPORT 版本内置到 DLL 中。 DLLIMPORT 版本将仅被编译 (/c),并且在链接主程序时仅使用 .mod,而不使用 ,obj。凌乱,我知道,这就是我们改变它的原因。