【问题标题】:Cannot create .lib file for a 64 bit Fortran DLL无法为 64 位 Fortran DLL 创建 .lib 文件
【发布时间】:2013-06-10 20:54:25
【问题描述】:

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

任何帮助将不胜感激!

【问题讨论】:

    标签: dll 64-bit fortran gfortran .lib


    【解决方案1】:

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

    gfortran -o main.exe -ldll_foo main.f95
    

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

    【讨论】:

    • 我认为我的问题并不清楚。我没有用 gfortran 编译 .exe,我需要 .dll 链接到我在 VS 中的 c++ 项目。为了清楚起见,我编辑了问题。
    • gfortran 和 VS 二进制文件不兼容。如果要将 gfortran 链接到 C++ 项目,则需要在 gcc 中重建 C++ 代码。基本上,你要么一直使用可视化工具,要么一直使用 GNU。目标文件和 DLL 格式不同。与 MS DLL 不同,GNU DLL 没有 DLLMain。
    • 感谢您的信息,我最终使用 CMake 创建了一个 .lib 文件。
    【解决方案2】:

    我结束了使用 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-08
      • 1970-01-01
      • 1970-01-01
      • 2020-03-25
      • 1970-01-01
      • 2019-10-09
      • 2021-05-12
      • 2013-04-04
      相关资源
      最近更新 更多