2

C++コードをfortranコードと統合する方法を探しています(fortranコードでいくつかのC/C++関数を呼び出すだけです)。

gcc またはコンソール コンパイラの提案をいくつか見つけましたが、このアプローチを変換してビジュアル スタジオ内の統合問題を解決する方法がわかりません。

現時点では、dll 形式の C++ コードを作成し、Fortran コードから呼び出すことを考えています。

誰かがすでに解決策を見たことがありますか? または、dll から関数を呼び出すためのオーバーヘッドについてはどうですか? 私の fortran コードは大量のメモリを C 関数に転送します。この問題を dll で解決した場合、何か問題はありますか?

どうも。

PS私はVisual Studio 2008 ProfとIntelコンパイラ10を使用しています

PPS私は、私が望むものをより具体的に指定する必要があると思います:私は、いくつかのC関数を使用するビジュアルスタジオでfortranプロジェクトをコンパイルしたいと思います。

4

6 に答える 6

4

これを行うための新しい方法があり、多くの利点があります。Fortran2003ISOCバインディングを使用してください。これは標準であるため、FortranとC(およびCの呼び出し規約を使用するすべての言語)とのインターフェースをとるOSおよび言語に依存しない方法です。Intel Fortran 11は、他の多くのコンパイラーとともにサポートします。バージョン10については不明です。ISOCバインディングを使用すると、任意のC名(どのような場合でも)に一致させることができ、アンダースコア(およびコンパイラー間のバリエーション)を気にする必要はありません。引数のタイプと呼び出しメソッド(参照、値)を指定します。Intelは、コンパイラを含むフォルダにいくつかの例を提供しています。gfortranマニュアルには例があり、Windowsに関する追加の考慮事項についても説明しています。こことIntelFortranフォーラムには以前の質問と回答があります。

于 2010-06-28T19:46:57.770 に答える
2

私は約 20 年前に C と Fortran を統合し、5 年前までこの統合を維持していました。私が使用したトリックは次のとおりです。

  • Fortran コンパイラではすべての記号が大文字で記述されることに気付きました。そのため、C/C++ 関数も大文字で記述されていることを確認してください。シンボルが .OBJ ファイルにどのように配置されているかを確認するには、DUMPBIN を使用します。
  • Fortran コンパイラーは、C++ コンパイラーが行う名前マングリングを認識しません。C スタイルの規則 (extern "C" を使用) を使用して、すべての C++ 関数をコンパイルします。
  • Fortran の引数は、常に参照/ポインターを使用してスタックに置かれます。したがって、C 関数ではポインター引数を使用してください。

正直、VS2005に乗り換えた時点でCとFortranの統合は諦めていたので、その頃とは変わっているのかもしれません。それでも、DUMPBIN を使用して Fortran コンパイラが生成するシンボルの種類を確認し、それに合わせて C/C++ ソースのコンパイルを調整することをお勧めします。

于 2010-06-28T19:09:02.073 に答える
2

私たちが働いている場所でそれを行います。

Intel Fortran コンパイラを使用している場合は、そのドキュメントを参照してください。デフォルトでは、Intel Fortran は参照によってすべてを渡し、(私が思うに) C 呼び出し規約を使用し、すべて大文字の識別子を使用します。文字列は特定の問題です。Fortran は長さを隠しパラメーターとして渡し、パラメーター リスト内のどこに移動するかについてコンパイラー設定を使用するためです。

賢明なプログラマーはデフォルトに依存せず (間違いが未定義の動作につながる可能性があります)、intelINTERFACEステートメントを使用して呼び出し規約、パラメーターの受け渡し、およびルーチンのリンク名を指定します。このページの情報(ATTRIBUTES プロパティと呼び出し規約)は必読です。特に、文字列の長さのパラメーターがいつどこで渡されるかについての難解なルールを理解する必要があります。私はそれのプリントアウトを持っており、個人に保管しています。:-)

もう 1 つ注意すべき点は、VisualStudio 6 より前のバージョンでは、Fortran と C のプロジェクトが混在することを好まないということです。makefile を呼び出すカスタム プロジェクト ファイルを作成することで問題を解決しましたが、これは PITA です。あなたが私たちのようにこれをやっているのでない限り、流れに沿って別々のプロジェクトを使用することをお勧めします.

于 2010-06-28T19:29:00.543 に答える
1

解決策が見つかりました: 解決策のリンク

リンクに関していくつかの問題がありましたが、プロジェクト プロパティを追加することで解決できます。

テスト用のコード:

#include <stdio.h>

extern "C"
{
    void f() 
    {
        printf("hi from c\n mega test");
    }
}

fortran コード

PROGRAM HelloWorld
use, intrinsic :: iso_c_binding
implicit none 
interface
    subroutine f( ) bind( c )
        use, intrinsic :: iso_c_binding
    end subroutine f   
end interface  
call f
END PROGRAM HelloWorld

オンデマンドでテストプロジェクトをアップロードできます。どうもありがとう、うまくいけば、それがcとfortranに関する私の最後の問題でした

于 2010-06-29T16:15:13.700 に答える
1

Visual Express 2010 のカスタム ビルド ツールのおかげで、Fortran ソースから obj をビルドできました。Visual Studio でも可能だと思います。

C と Fortran を一緒に使用したい場合は、ここに優れたチュートリアルがあります。これは gcc コンパイラ用に書かれていますが、名前マングリングを簡単に処理する方法を学ぶことができるはずです。

コンパイラに応じて、コンパイルされたサブルーチン/関数は大文字/小文字であり、末尾にアンダースコアがあり、先頭にアンダースコアがあります.

モジュールを使用する方法もiso_c_bindingありますが、これは Fortran 2003 でのみ使用できます。

于 2012-12-10T20:13:48.490 に答える
0

これは、gccとコンソールでどのように機能するかです

cc:

#include <stdio.h>

void f_()
{
    printf("Hi from C\n");
} 

fortran.f90

PROGRAM HelloWorld
   CALL f
END PROGRAM HelloWorld

メイクファイル

SRCDIR=.

all: clean release run

release:
    gcc -c c.c -o c.out 
    gfortran -c fortran.f90 -o fortran.out
    gfortran -o out.exe fortran.out c.out
run:
    out.exe

clean:
    @$(ZSHMAGIC)  rm -rf *.exe core* *.o a.out 2> /dev/null

もう 1 つの質問: Fortran プログラムで使用する C 関数名の後に常に「_」を追加する必要がありますか?

于 2010-06-28T19:09:40.670 に答える