古い 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 ファイルの作成にあるのかわかりません。
どんな助けでも大歓迎です!