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
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;
}

注:呼び出し元のプログラムビット数とバージョンはライブラリと一致する必要があります