5

私が使用しているソースコードは、もともとIntel Fortranコンパイラ用に作成されているため、次のようなプリプロセッサディレクティブがあります。
!DEC$ATTRIBUTES DLLEXPORT::MYDLL
!DEC$ATTRIBUTES STDCALL::MYSUBROUTINE
!DEC$ATTRIBUTES ALIAS: 'MYENTRYPOINT'::MYSUBROUTINE

これをgfortranで動作するように変換するにはどうすればよいですか。主に、エントリポイントを定義して名前を付けられるようにしたいと思います。現在、gfortranを使用してコンパイルすると、すべてのサブルーチンがエントリポイントとして公開されます。また、エントリポイント名はすべて小文字で、末尾にアンダースコアが付いています。

4

2 に答える 2

6

ルーチンをモジュールに配置し、ステートメントPRIVATEをモジュールの先頭に配置すると、PUBLIC :: name1, name2のプロシージャname1name2のみがモジュールの外部で表示されます。これは、モジュールを含むオブジェクト コードを配置するライブラリに続く必要があります。これは Fortran 90 以降でサポートされています。

@janneb が既に回答したように、bind (C,name=X)アプローチを使用して、プロシージャの外部から見える名前を完全に制御し、プロシージャの Fortran 名をオーバーライドできます。これは Fortran 2003 の一部であり、長年にわたって多数のコンパイラでサポートされています。bind(C) アプローチで考えられる問題は、ルーチンの呼び出し規則が C のものであることを指定することです。これがその Fortran とは異なり、これらのルーチンを Fortran から呼び出したい場合、複雑さが増します。次に、呼び出し元の Fortran ルーチンに、C ルーチンのように見えるものを呼び出していることを通知するインターフェイスを指定する必要があります。C から呼び出していない限り、リンカに表示される名前を気にする人はめったにいないので、C 呼び出し規則が必要になる場合があります。

FortranおよびC/C++、FORTRAN、アンダースコア、および GNU Autotoolsのプライベート関数の

于 2012-01-04T16:43:19.093 に答える
4

GFortran はいくつかの属性をサポートしています。

http://gcc.gnu.org/onlinedocs/gfortran/GNU-Fortran-Compiler-Directives.html#GNU-Fortran-Compiler-Directives

シンボル名を変更するには、ISO_C_BINDING の bind(C, name=) 指定子を使用できます。例を参照してください。

http://gcc.gnu.org/onlinedocs/gfortran/Interoperable-Subroutines-and-Functions.html#Interoperable-Subroutines-and-Functions

http://gcc.gnu.org/onlinedocs/gfortran/Interoperable-Global-Variables.html#Interoperable-Global-Variables

于 2012-01-04T15:23:02.527 に答える