gpt4 book ai didi

c++ - 使用英特尔编译器从 C++ 调用 Fortran 子例程

转载 作者:搜寻专家 更新时间:2023-10-31 00:43:41 25 4
gpt4 key购买 nike

我需要在 C++ 代码中调用 Fortran 程序。该程序是使用 Intel 编译器编译的 Fortran 程序跨越多个文件,过去被称为 PROGRAM。我试图做的是将主程序调用更改为一个名为 SIMULATOR 的子程序。然后,我将每个 Fortran 源代码编译成一个目标文件,而不是将它们全部放入可执行文件中。然后我准备好将所有 Fortran 对象与一个简单的 C++ 包装器链接起来进行测试。代码和 makefile 如下。

包装器.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 系统上找到英特尔编译器的路径,所以我会很感激一些寻找正确方向的帮助。在尝试将 Fortran 程序与 C++ 链接之前,我不需要做任何特殊的事情来编译它,所以我一直在思考从这里到哪里去。

顺便说一下,Fortran 程序不需要任何输入,它是独立的。

在此先感谢您的帮助和见解!

编辑:

哪个ifort给了我: /usr/global/intel/Compiler/11.1/073/bin/intel64/ifort

尝试使用 ifort 完成最终链接后,出现以下错误:

ld: 找不到 -lunwind

我找到了关于 unwind 的文档 (https://savannah.nongnu.org/news/?group=libunwind),但我自己并没有尝试调用这个库,也不知道这是从哪里来的。

最佳答案

最简单的方法是使用 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 绑定(bind)将变得更加有用。

关于c++ - 使用英特尔编译器从 C++ 调用 Fortran 子例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10272714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com