我已经用 C++ 为一些旧的 Fortran(我认为是 g77)代码编写了一些包装函数。我使用旧的 Visual Fortran 编译器创建了 .dll 和 .lib,并将所有内容链接起来并在 Visual Studio 中工作。
我现在遇到的问题是创建一个等效的 64 位版本。我已经安装了 gfortran 并创建了一个 64 位的 .dll,但没有随之生成 .lib,而且如果没有它,我似乎无法链接到 DLL 或调用任何 fortran 函数。
我用命令创建了我的 64 位 .dll ......
$ gfortran -c {filenames.for}
$ gfortran -m64 -shared -mrtd -o dll_foo.dll {filenames.o}
这是来自 fortran 的示例子例程...
SUBROUTINE KFACT(TR, RHOL, RHOV, FLIQ, FVAP, XK, IWANT, PROPR)
!DEC$ ATTRIBUTES DLLEXPORT :: KFACT
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
INCLUDE 'nprop.cmn'
DIMENSION PROPR(NPROP)
DIMENSION IWANT(NPROP)
C
C SET IWANT VECTOR TO RETURN FUGACITY COEFFICIENT
C
CALL IVZERO(IWANT, NPROP)
IWANT(13) = 1
C
C CALL PROP2 TO RETURN VAP AND LIQ FUGACITY COEFFICIENTS
C
CALL PROPS2(IWANT, 0, TR, RHOL, PROPR)
FLIQ = PROPR(13)
CALL PROPS2(IWANT, 0, TR, RHOV, PROPR)
FVAP = PROPR(13)
C
XK = FLIQ / FVAP
C
RETURN
END
C
SUBROUTINE PDP(DEL, TR, PR, DPRDD, IWANT, PROPR)
如何从我的 Visual Studio (2005) c++ 项目创建要链接到的 .dll 和 .lib 文件?
/////////////////////////////更新//////////////////// /////////
我已经能够使用以下命令创建一个 .lib 文件...
ar -cru libName.lib {filenames.o}
ranlib libName.lib
将此库添加到 VS 中的附加依赖项后,调用所有 fortran 函数时都会出现 LNK 错误。c ++中的fortran声明看起来像......
extern "C" void PSAT(double& TK, double& PMPA, double& RHOL, double& RHOV, int IWORK[], double PROPR[], int& IERR);
以及此功能的 LNK 错误...
error LNK2028: unresolved token (0A00004A) "extern "C" void __cdecl PSAT(double &,double &,double &,double &,int * const,double * const,int &)" (?PSAT@@$$J0YAXAEAN000QEAHQEANAEAH@Z) referenced in function "double __cdecl PFTH(double,double,int)" (?PFTH@@$$FYANNNH@Z)
error LNK2019: unresolved external symbol "extern "C" void __cdecl PSAT(double &,double &,double &,double &,int * const,double * const,int &)" (?PSAT@@$$J0YAXAEAN000QEAHQEANAEAH@Z) referenced in function "double __cdecl PFTH(double,double,int)" (?PFTH@@$$FYANNNH@Z)
我曾尝试在 fortran 代码中添加不同的指令来解析类似的名称,但我没有成功。
我不知道问题出在 c 代码、fortran 代码还是 .lib 文件的创建上。
任何帮助将不胜感激!