問題タブ [intel-fortran]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - メインの fortran プログラムへの未定義の参照
3 つのループ カーネルをベンチマークするための Fortran コードを作成しています。
次のようにCソースファイル内に記述したダミー関数
また、dummy.h には関数プロトタイプが含まれているだけです。
dummy.o オブジェクト ファイルを作成し、Intel ifort コンパイラを使用して Fortran ソース コードとリンクしようとしています。残念ながら、関数MAIN__':bench.f90:(.text+0x8ca): undefined reference to
のダミー_でエラーが発生しています '
ダミー関数が呼び出されるたびに。なにか提案を?前もって感謝します。
c - Fortran および C と Makefile の混同
メイクファイルを作るのは初めてです。私の Fortran コードは C ソース ファイルで定義されたいくつかの関数を使用しているため、少し混乱しています。これは私がこれまでに書いたものです:
私は正しい軌道に乗っていますか?
module - ソースをコピーしたりライブラリを作成したりせずに Fortran モジュールを再利用する方法
ライブラリをビルドしたり、ソース コードを複製したりせずに、複数の Fortran プロジェクト間でコードを共有するかどうか、またはその方法を理解するのに苦労しています。
Linux システムで Intel コンパイラ (ifort) と一緒に Eclipse/Photran を使用していますが、特定のツールよりもモジュールに大きな概念上の問題があると思います。
簡単な例を次に示します。~/workspace/cow には、cow.f90 (プログラム) を含むソース ディレクトリ (src) と、m_graze.f90 と m_moo.f90 にそれぞれ m_graze と m_moo という 2 つのモジュールがあります。このプロジェクトは、実行可能ファイル 'cow' を作成するために適切にビルドおよびリンクされます。実行可能ファイルとモジュール (m_graze.mod および m_moo.mod) は ~/workspace/cow/Debug に保存され、オブジェクト ファイルは ~/workspace/cow/Debug/src に保存されます。
その後、~/workplace/sheep を作成し、src/sheep.f90 をプログラムとして、src/m_baa.f90 をモジュール m_baa として作成します。ruminate() サブルーチンにアクセスするために、sheep.f90 で「m_graze のみ: ruminate を使用」したいと考えています。m_graze.f90 をコピーすることもできますが、コードが同期しなくなり、m_graze の依存関係が考慮されない可能性があります。これらの理由から、m_graze を cow プロジェクトに残して、それに対して shep.f90 をコンパイルしてリンクしたいと思います。
羊のプロジェクトをコンパイルしようとすると、次のようなエラーが発生します。
[プロパティ: 羊のプロジェクト参照] で、牛のプロジェクトを選択できます。Properties:Fortran Build:Settings:Intel Compiler:Preprocessor の下で、~/workspace/cow/Debug (モジュール ファイルの場所) をインクルード ディレクトリのリストに追加して、コンパイラが牛のモジュールを見つけて、sheep.f90 をコンパイルするようにします。ただし、リンカーは次のようなもので終了します。
これは通常、リンクする適切なライブラリがない場合を除いて、ライブラリとライブラリ パスをリンカー設定に追加することで解決されます (これは C ではなく Fortran です)。
牛プロジェクトは、cow.f90、m_graze.f90、および m_moo.f90 を実行可能ファイルにコンパイルおよびリンクすることが完全に可能でした。ただし、sheep プロジェクトは、sheep.f90 および m_baa.f90 をコンパイルし、m_graze.mod モジュールを見つけることができますが、必要な情報がすべてシステムに存在するにもかかわらず、m_graze のシンボルを見つけることができないようです。 .
ifort のリンカ部分に不足している部分を見つけてそれらを結合させるのは簡単な構成のように思えますが、これを実現するために Photran UI のどこにどのマジック ワードを入力する必要があるかわかりません。
私は、C および C のビルド プロセスに対する関心と能力が完全に欠如していることを認めます。これを機能させる唯一の方法でない限り、ライブラリ (.a または .so) を作成する流用は避けたいと思います。
最終的に、私はこの問題に対する純粋な Fortran ソリューションを探しています。これにより、ソース コードの単一のコピーを保持でき、カスタム Makefile の山を手動で維持する必要がなくなります。
それで、これはできますか?
これがすでにどこかに文書化されている場合はお詫びします。Google は、簡単なビルド例、モジュールの作成方法、および既存のライブラリとのリンク方法を示しているだけです。ソースコードの複製を伴わないモジュールでのコードの再利用の例は (m) ないようです。
編集
回答者が指摘しているように、.mod ファイルは必要ですが、十分ではありません。リンク フェーズでは、オブジェクト コード (m_graze.o の形式) または静的ライブラリまたは共有ライブラリのいずれかを指定する必要があります。.mod ファイルは、オブジェクト コード/ライブラリへのインターフェイスを記述しますが、最終的な実行可能ファイルをビルドするには両方が必要です。
このような非常に単純化されたおもちゃの問題の場合、提示された質問に答えるにはこれで十分です。
より複雑な依存関係を持つ大規模なプロジェクト (私の場合、LAPACK95 の MKL バージョンにリンクする F90 の 80 + KLOC) では、IDE またはツールチェーンに、単一の標準的なソース ファイル セットを共有するための十分な自動またはユーザー インターフェイス機能がない場合があります。実行可能な戦略。選択は、重複するソース ファイルが同期しなくなる危険を冒すか、IDE の多くの利点を放棄するか (つまり、make/CMake/SCons ファイルの手動作成を回避する)、またはおそらくその両方のいずれかのようです。リビジョン管理システムと優れたコード編成は役に立ちますが、現在の Eclipse の状態を考えると、プロジェクト間でソース ファイルの単一の標準セットを共有することは決して容易ではないことは明らかです。
fortran - move_alloc が gfortran (4.6.3) では機能しないのに、ifor では機能するのはなぜですか?
ここで、move_alloc が gfortran 4.2 以降で機能することを読みました。ubuntu 12.04にgfortran 4.6がインストールされていますが、move_allocが機能していません! move_alloc は、10 回実行されるループ内で 5 回使用されます。gfrotran を使用して (エラーや警告なしで) コンパイルした後、プログラムはループの 1 つのステップのみを実行し (間違いを確認するためにいくつかの出力が表示されます)、「セグメンテーション違反 (カーネル イメージが記録されました)」と表示されます。ただし、ifort を使用すると、プログラムはCentOS で gfortran 4.4.6 を使用しようとしました. どちらのコンピューターも x86_64 です.
その他の重要な情報: コードのこの部分は、move_alloc によって割り当てられたベクトルのサイズがわからない場合、モジュール内のサブルーチンにあります。これらすべてのベクトルは、サブルーチンで属性インテント (out) を使用しています。xray_all、yray_all、elem_all は倍精度で、その他は整数です。メインとモジュールは別のファイルにあります。これは、move_alloc を使用するコードの一部です。
c - Fortran から呼び出された C 関数にパラメータがない
C 関数を呼び出す Fortran 90 コードを使用しています。このコードは十分にテストされており、インテル Fortran コンパイラーで正常にコンパイルされます。GNU Fortran コンパイラで動作するようにしようとしています。F90 コードは C 関数を呼び出しますが、一部のパラメーターが指定されていません。呼び出しは次のようになります。
これは明らかに ifort では正常に機能しますが、gfortran では機能しません。エラーで失敗します。
ここで、1 は最初のブランク引数に続くコンマにあります。ここで何が起こっているのかについての情報が見つかりません。これは、仮引数を渡すための Intel コンパイラ固有の構文ですか? もしそうなら、誰かが私に参考文献を教えてもらえますか?
fortran - 関数戻り派生型での gfortran と ifortran の異なる動作
Fortran で派生型の属性のメモリ アドレスを格納する必要があるプロジェクトに取り組んでいます。gfortran で見つかったものは、戻り値が派生型の場合、関数の戻り値の暗黙のコピーがあります。だから私が保存したアドレスは無意味です。コードの一部があります:
gfortran を使用した出力は次のとおりです。
ifort を使用した出力は次のとおりです。
結果が一貫しているように、gfortranでそのようなコピーを回避する方法はありますか? フォートランを習い始めたばかりです。関数の記述子またはコンパイラのオプションがある場合があります。
visual-studio-2008 - Fortran 配列未定義アドレス
Intel fortran コンパイラ (10.1.025) で Visual Studio 2008 を使用しています。
私のプログラムには、サブルーチン solvemgmt() があります
デバッグ中、ブレークポイント 1 で、
ブレークポイント2の時、
T2F、INTFR、T2FORCE、JFRES、および T1FORCE が未定義のアドレスとして表示され、次に未定義のポインター/配列として表示される理由がわかりません。