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) を見つけましたが、このライブラリを自分で呼び出そうとしなかったため、これがどこから来たのかわかりません。