Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译fortran和C++;英特尔编译器的编程与链接_C++_Fortran_Intel Fortran - Fatal编程技术网

C++ 编译fortran和C++;英特尔编译器的编程与链接

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++支持

我有一个Fortran主程序,其中有许多子程序。其中一个子例程调用C++函数。C++函数正在调用另一个FORTRAN子程序。现在,我需要将所有这些代码编译在一起以获得输出。
我尝试用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);