4

我必须在 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 但出现错误:

“InitAllPublicVars”运行时错误 453 中的未处理错误:在 SomeLib.DLL 中找不到 DLL 入口点 DLLVersion

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

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

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

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

一般的 一些选项 进口

4

2 回答 2

4

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

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

于 2013-04-19T01:15:23.023 回答
2

我找到了解决方案。DLL 函数应该这样声明:

extern "C" void __declspec(dllexport) SetBoundaries( int min , int max ) {

}

请注意,参数不是指针。我记录了函数调用,并且 DLL 在放置时从主机应用程序获取有效数字,而不是原始 Fortran DLL。使用 Visual Studio 2008 编译。

于 2013-04-21T10:30:29.483 回答