我需要在 C++ 代码中调用 Fortran 程序。该程序使用 Intel 编译器进行编译 Fortran 程序跨越多个文件,过去被称为 PROGRAM。我试图做的是将主程序调用更改为名为 SIMULATOR 的子程序。然后,我将每个 Fortran 源代码编译为目标文件,而不将它们全部放入可执行文件中。然后,我准备用一个简单的 C++ 包装器将所有 Fortran 对象链接起来进行测试。代码和生成文件如下。
包装器.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 系统上找到英特尔编译器的路径,所以我希望能在正确的方向上提供一些帮助。在我尝试将它与 C++ 链接之前,我不需要做任何特别的事情来编译 fortran 程序,所以我有点想从这里去哪里。
顺便说一句,Fortran 程序不需要任何输入,它都是独立的。
提前感谢您的帮助和见解!
编辑:
ifort 给了我:/usr/global/intel/Compiler/11.1/073/bin/intel64/ifort
尝试使用 ifort 完成最终链接后,出现以下错误:
ld:找不到-lunwind
我找到了关于 unwind 的文档(https://savannah.nongnu.org/news/?group=libunwind),但我没有尝试自己调用这个库,也不知道这是从哪里来的。