C++ 编译fortran和C++;英特尔编译器的编程与链接
我有一个Fortran主程序,其中有许多子程序。其中一个子例程调用C++函数。C++函数正在调用另一个FORTRAN子程序。现在,我需要将所有这些代码编译在一起以获得输出。C++ 编译fortran和C++;英特尔编译器的编程与链接,c++,fortran,intel-fortran,C++,Fortran,Intel Fortran,我有一个Fortran主程序,其中有许多子程序。其中一个子例程调用C++函数。C++函数正在调用另一个FORTRAN子程序。现在,我需要将所有这些代码编译在一起以获得输出。 我尝试用ICL编译C++文件。然后我使用iFort作为fortran文件和为C++创建的对象文件之间的链接器。但这种方法不起作用。它显示未解析的外部符号。我希望您至少看到了以下内容: 他们写的东西主要是C,虽然有提到C++库。如果你与C++ OCDE链接,你需要这些。 您应该阅读有关C++中符号名称的模糊处理。因为C++支持
我尝试用ICL编译C++文件。然后我使用iFort作为fortran文件和为C++创建的对象文件之间的链接器。但这种方法不起作用。它显示未解析的外部符号。我希望您至少看到了以下内容: <>他们写的东西主要是C,虽然有提到C++库。如果你与C++ OCDE链接,你需要这些。 您应该阅读有关C++中符号名称的模糊处理。因为C++支持重载函数,但是链接器需要唯一的符号,C++生成 类似于函数foo(int i,float j)的
\u foo****@8
而不是foo
,其中*取决于编译器和参数类型
FORTRAN代码生成C样式符号,如果使用Bin(C),则可以强制C++生成函数,通过C++中的代码>外部“C”<代码>,既可以从C++调用fortran函数原型,也可以从FORTRAN调用函数。
此示例与C编译器一起使用,但是对于C++,需要更改生成的符号()。请注意,C和Fortran互操作性不是标准化的,通常不能从一个编译器集移植到另一个编译器集。我不得不处理COMPAQ编译器在函数名中使用的问题,而不是C++的方式,或者PGI FORTRAN需要STDCULL约定。 Fortran代码示例
C结构声明示例 C函数原型示例 C调用序列示例提供一个简单的例子,从Fortran调用C,或者从C调用Fortran,以获得不仅仅是理论上的建议?你能提供更多的信息,比如代码示例吗?我只需要知道编译过程。就像只有fortran子程序一样,然后是:ifort/c*.f,然后是ifort/exe:trial1*.obj。那么,如果C++中还有子程序,需要修改什么命令。
subroutine Simulation(alpha, beta, gamma, delta, arrays) BIND(C)
use, intrinsic :: ISO_C_BINDING
implicit none
integer (C_LONG), value :: alpha
real (C_DOUBLE), intent(inout) :: beta
integer (C_LONG), intent(out) :: gamma
real (C_DOUBLE),dimension(*),intent(in) :: delta
type, BIND(C) :: pass
integer (C_INT) :: lenc, lenf
type (C_PTR) :: c, f
end type pass
type (pass), intent(inout) :: arrays
real (C_FLOAT), ALLOCATABLE, target, save :: eta(:)
real (C_FLOAT), pointer :: c_array(:)
...
! Associate c_array with an array allocated in C
call C_F_POINTER (arrays%c, c_array, (/arrays%lenc/) )
...
! Allocate an array and make it available in C
arrays%lenf = 100
ALLOCATE (eta(arrays%lenf))
arrays%f = c_loc(eta)
...
end subroutine Simulation
struct pass {int lenc, lenf; float *c, *f;};
void simulation(long alpha, double *beta,
long *gamma, double delta[], struct pass *arrays);
simulation(alpha, &beta, &gamma, delta, &arrays);