C++呼び出しFortranのダイナミックリンクライブラリ
1548 ワード
前の時間に1つの課程の設計をするため、先生は1つの関数のFortranソースコードを提供しました.CとFortranは混在してプログラミングできるそうですが、本人はFortranができないので、Fortranのソースコードをダイナミックリンクライブラリにコンパイルし、C++で呼び出すことにしました.
Fortranダイナミックリンクライブラリのコンパイル
*FortranはIntel公式サイトでダウンロードしたIVFですhttps://software.intel.com/zh-cn/parallel-studio-xe
*VS2019https://www.visualstudio.com
IVFインストール完了後、VS 2019でFortranダイナミックリンクライブラリプロジェクトを新規作成し、ライブラリ関数に出力したいサブルーチンの下に追加
!DEC$ ATTRIBUTES DLLEXPORT::FunctionName
生成を実行すると、対応する経路で得られる.libファイルと.dllファイル
C++呼び出しFortranダイナミックリンクライブラリ
VSでC++空のプロジェクトを作成し、プロジェクト->プロパティ->リンク->入力->追加依存項目に呼び出したいlibファイルを追加し、libファイルをプロジェクトのルートディレクトリにコピーします.
まず暗黙呼び出し
C++でC言語の呼び出し規則を使用するためextern"C"が必要であり、C言語では2つのスタック管理方式がそれぞれ_stdcallと_cdecl,
_stdcall:パラメータは右から左にスタックに押し込まれ、スタックは関数によって自分でクリーンアップされます.
_cdecl:パラメータは右から左にスタックに押し込まれ、スタックは呼び出し側によってクリーンアップされます.
デフォルトMSVC Yesstdcall方式、Fortranは_cdeclなので、スタック管理方式をここで宣言する必要があります.
次に呼び出しの表示
注:呼び出し元のプログラムビット数とバージョンはライブラリと一致する必要があります
Fortranダイナミックリンクライブラリのコンパイル
*FortranはIntel公式サイトでダウンロードしたIVFですhttps://software.intel.com/zh-cn/parallel-studio-xe
*VS2019https://www.visualstudio.com
IVFインストール完了後、VS 2019でFortranダイナミックリンクライブラリプロジェクトを新規作成し、ライブラリ関数に出力したいサブルーチンの下に追加
!DEC$ ATTRIBUTES DLLEXPORT::FunctionName
SUBROUTINE MYPRINT(X)
!DEC$ ATTRIBUTES DLLEXPORT::SUM
print *,X
end SUBROUTINE
生成を実行すると、対応する経路で得られる.libファイルと.dllファイル
C++呼び出しFortranダイナミックリンクライブラリ
VSでC++空のプロジェクトを作成し、プロジェクト->プロパティ->リンク->入力->追加依存項目に呼び出したいlibファイルを追加し、libファイルをプロジェクトのルートディレクトリにコピーします.
まず暗黙呼び出し
#pragma comment(lib,"Test.lib")
extern "C" void _cdecl MYPRINT(double *x);
int main()
{
MYPRINT(3.1415);
return 0;
}
C++でC言語の呼び出し規則を使用するためextern"C"が必要であり、C言語では2つのスタック管理方式がそれぞれ_stdcallと_cdecl,
_stdcall:パラメータは右から左にスタックに押し込まれ、スタックは関数によって自分でクリーンアップされます.
_cdecl:パラメータは右から左にスタックに押し込まれ、スタックは呼び出し側によってクリーンアップされます.
デフォルトMSVC Yesstdcall方式、Fortranは_cdeclなので、スタック管理方式をここで宣言する必要があります.
次に呼び出しの表示
#include
int main()
{
typedef void(_cdecl* MYPRINT)(double *x);
HINSTANCE hLibrary = LoadLibrary("Test.dll");
MYPRINT myprint = (MYPRINT)GetProcAddress(hLibrary, "MYPRINT");
myprint(3.1415);
return 0;
}
注:呼び出し元のプログラムビット数とバージョンはライブラリと一致する必要があります