0

我已经用 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 文件的创建上。

任何帮助将不胜感激!

4

2 回答 2

0

与基于 MS 的链接器不同,基于 GNU 的链接器不需要 .lib 文件。您需要做的就是在 dll 前面加上 lib。在您的情况下,它将是 libdll_foo.dll。要链接,只需删除 lib。例如,链接到一个名为 main 的程序

gfortran -o main.exe -ldll_foo main.f95

它需要 libdll_foo 在路径上。或者,您可以使用 -L 参数告诉它在哪里可以找到 libdll_foo.dll。

于 2013-06-10T22:05:54.537 回答
0

我结束了使用 CMake 创建我的 X64 .lib 文件。如果有人感兴趣,这里是 CMakeLists。

cmake_minimum_required(VERSION 2.8)
enable_language(Fortran)
set(CMAKE_Fortran_CREATE_SHARED_LIBRARY ON)
set(CMAKE_Fortran_COMPILER gfortran)
add_library(Steam64 SHARED AUXPK.o eospk.o INTPK.o PROPPK.o SOLVPK.o coef.cmn     coefig.cmn nprop.cmn wconst.cmn)
SET_TARGET_PROPERTIES(Steam64 PROPERTIES LINKER_LANGUAGE C ARCHIVE_OUTPUT_DIRECTORY        "C:/Users/MYNAH/Desktop/fortranSource/build")

add_executable(testf AUXPK.o eospk.o INTPK.o PROPPK.o SOLVPK.o coef.cmn coefig.cmn     nprop.cmn wconst.cmn)
target_link_libraries(testf Steam64)
于 2013-06-13T20:04:03.607 回答