gpt4 book ai didi

c++ - 如何在 C++ 中创建动态 DLL 库,以替代遗留的 Fortran DLL

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:37:27 24 4
gpt4 key购买 nike

我必须在 C++ 中创建一个动态 DLL 库,以替代用 Fortran 编写的旧 DLL 库,而无需更改主机应用程序(因此函数和参数必须保持不变)。

我有那个库中所有 Fortran 函数的完整规范,但是我需要使用什么工具(编译器),以及在这种情况下编码 DLL 的方式是什么(stdcall、cdecl、dllexport 等 - 这些线索没有不用多说,我以前从未创建过 DLL)。

这是遗留 DLL 中的示例 Fortran 函数声明:

SUBROUTINE SetBoundaries(MaxFlow, MinFlow)
cDEC$ ATTRIBUTES DLLEXPORT :: SetBoundaries
cDEC$ ATTRIBUTES ALIAS: "SetBoundaries" :: SetBoundaries

REAL MaxFlow
REAL MinFlow

我尝试编译 VC2008 DLL 但出现错误:

Unhandled error in 'InitAllPublicVars' Run-time error 453: Can't find DLL entry point DLLVersion in SomeLib.DLL

此 DLL 的来源(定义名为 DLLVersion 的函数没有帮助):

void __stdcall SetBoundaries( float *min , float *max ) {
}

DLLVersion 是一些特殊的 DLL 过程还是我的文档中缺少,我应该创建这样的函数?

我不知道原始 Fortran DLL 源代码/编译过程的细节,但有一些提取的信息:

General Some options Imports

最佳答案

运行时库使 Fortran DLL 看起来像是使用 Compaq 或 Digital Fortran 编译器构建的。默认情况下,这些编译器使用 stdcall 调用约定。对于您的具体示例,两个参数(C 端的参数)相当于 float *,子程序相当于 void 函数。您需要使用支持 stdcall 的 C++ 编译器。您指定函数在 DLL 中导出的方式取决于您的 C++ 编译器或个人偏好,但典型的是某种 dllexport 关键字。

从变更管理的角度来看,用 Fortran 编写替换 DLL 并使用类似 Intel Fortran 编译器的东西要简单得多,它是 CVF 编译器的后代,具有适当的遗留支持。然后可以以渐进的方式对 DLL 源代码进行更改。

关于c++ - 如何在 C++ 中创建动态 DLL 库,以替代遗留的 Fortran DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16055051/

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