无法为64位Fortran DLL创建.lib文件

时间:2013-06-10 20:54:26

标签: dll 64-bit fortran gfortran .lib

我已经在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文件?

///////////////////////////// UPDATE ///////////////// ////////////

我已经能够使用以下命令创建.lib文件...

ar -cru libName.lib {filenames.o}
ranlib libName.lib

将此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文件的创建中。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

与基于MS的链接器不同,基于GNU的链接器不需要.lib文件。您需要做的就是使用lib为dll添加前缀。在你的情况下,它将是libdll_foo.dll。要链接,只需删除lib。例如,链接到名为main

的程序
gfortran -o main.exe -ldll_foo main.f95

它需要libdll_foo在路径上。或者,你可以告诉它在哪里找到带有-L参数的libdll_foo.dll。

答案 1 :(得分: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)