2

C++ コード内で Fortran プログラムを呼び出す必要があります。プログラムは Intel コンパイラを使用してコンパイルされます。Fortran プログラムは複数のファイルにまたがり、PROGRAM として呼び出されていました。私が試みたのは、メインの PROGRAM 呼び出しを SIMULATOR というサブルーチンに変更することでした。次に、すべての Fortran ソース コードを実行可能ファイルに入れずに、各 Fortran ソース コードをオブジェクト ファイルにコンパイルしました。次に、すべての Fortran オブジェクトを単純な C++ ラッパーにリンクしてテストする準備が整いました。コードとメイクファイルが続きます。

ラッパー.cpp:

#include <iostream.h>

using namespace std;

extern "C"{
void simulator_();
}

int main()
{
    cout << "starting..." << endl;
    simulator_();
    cout << "success!" << endl;
    return 0;
}

メイクファイル:

all:
    ifort -nologo -O3 -cxxlib -nofor-main -gen-interfaces -traceback -check bounds -save -static -threads -c modules.for
    ifort -nologo -O3 -cxxlib -nofor-main -gen-interfaces -traceback -check bounds -save -static -threads -c Finterp.for
--a few more sources go here--
    ifort -nologo -O3 -cxxlib -nofor-main -gen-interfaces -traceback -check bounds -save -static -threads -c Simsys.for
    icpc -c wrapper.cpp
    icpc -o cppprogram *.o

これは、コンパイラからの出力 (の一部) です。Simsys は、呼び出しようとしているシミュレーター関数を含むファイルです。

Simsys.o: In function `simsys_':
Simsys.for:(.text+0xed4): undefined reference to `for_write_int_lis'
Simsys.for:(.text+0xeef): undefined reference to `for_adjustl'
Simsys.for:(.text+0xf38): undefined reference to `for_trim'
Simsys.for:(.text+0xf83): undefined reference to `for_concat'
Simsys.for:(.text+0x1071): undefined reference to `for_open'
Simsys.for:(.text+0x131d): undefined reference to `for_emit_diagnostic'
Simsys.o:Simsys.for:(.text+0x1670): more undefined references to `for_emit_diagnostic' follow

同様の問題を抱えている人によると (http://www.velocityreviews.com/forums/t288905-intel-compiler-8-1-c-calling-fortran-routine.html)、行方不明のようですいくつかのライブラリ。その人は、特定のライブラリが含まれていると書いており、それが役に立ちましたが、必要なライブラリを探す方法がわかりません。また、使用している HPC システムで Intel コンパイラのパスを見つける方法がわからないため、正しい方向に向けて助けていただければ幸いです。Fortran PROGRAM を C++ とリンクしようとする前にコンパイルするために特別なことをする必要はなかったので、ここからどこへ行くべきかについて考えるのにちょっと行き詰まりました。

ところで、Fortran プログラムは入力を必要とせず、すべて自己完結型です。

あなたの助けと洞察を前もって感謝します!

編集:

どの ifort がくれたか: /usr/global/intel/Compiler/11.1/073/bin/intel64/ifort

ifort を使用して最終リンクを実行しようとした後、次のエラーが発生しました。

ld: -lunwind が見つかりません

アンワインドに関するドキュメント (https://savannah.nongnu.org/news/?group=libunwind) を見つけましたが、このライブラリを自分で呼び出そうとしなかったため、これがどこから来たのかわかりません。

4

2 に答える 2

3

簡単な方法は、リンクに ifort を使用して、Fortran ランタイム ライブラリを取得することです。一部の手順はhttp://www.ualberta.ca/AICT/RESEARCH/LinuxClusters/doc/ifc91/main_for/mergedProjects/bldaps_for/pgsclmix.htmにあります。

Fortran 側で ISO_C_Binding を使用すると、ルーチンの名前を制御してアンダースコアを取り除くことができます。些細なことですが、C/C++ と Fortran の間に引数を追加し始めると、ISO C バインディングがより便利になります。

于 2012-04-22T22:58:12.650 に答える
2

Fortran と C++ のコンパイル/リンクはかなり可能ですが、解決すべき詳細がいくつかあります。Intel はオンラインでドキュメントを提供しています: http://software.intel.com/en-us/articles/intel-fortran-composer-xe-documentation/

インテル Fortran コンパイラ ユーザー/リファレンス ガイド、特に「コンパイラ リファレンス」/「混合言語プログラミング」/「Fortran/C 混合言語プログラム」のセクションを参照してください。また、「コンパイラ リファレンス」/「ライブラリ」セクションも役立ちます。

最後に、多くの fortran 静的ライブラリをリンク行に含める必要があり、アプリケーションでいくつかの fortran ランタイム dll を再配布する必要がある場合があります。

于 2012-04-22T23:02:57.277 に答える