0

古い Fortran (g77 だと思います) コードのいくつかのラッパー関数を c++ で書きました。古い 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

X64 .lib ファイルを作成するために CMake を使用することをやめました。興味のある方は、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 に答える
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 に答える