2017-08-03 122 views
-2

我有一个Fortran主程序,下面有很多子程序。其中一个子程序调用C++函数。该C++函数调用另一个Fortran子例程。现在我需要将它们全部编译在一起以获取输出。 我试图用icl编译C++文件。然后,我使用ifort作为Fortran文件和为C++创建的对象文件之间的链接器。但该方法不起作用。它显示无法解析的外部符号。编译Fortran和C++程序并从intel编译器链接

+0

提供最小示例https://stackoverflow.com/help/mcve,从调用的Fortran C,FORTRAN或从C到获得超过只是理论建议? – Swift

+0

你能提供更多的信息,如代码示例吗? –

+0

我只需要知道编译过程。就像如果只有fortran子例程那么:ifort/c * .f和之后的ifort/exe:trial1 * .obj。因此,如果在C++中有子程序,那么需要修改哪个命令。 –

回答

0

我希望你至少看到这个:https://software.intel.com/en-us/node/691954

他们所写的大多是有指C,虽然存在的C++库提。如果你与C++ ocde链接,你需要那些。 您应该阅读关于在C++中改变符号名称的信息。由于C++支持过载的功能,但链接器需要独特的符号,因此对于函数foo(int i,float j),C++生成 类似_foo****@8而不是foo,其中*取决于编译器和参数类型。

如果使用BIND(C),Fortran代码将生成C风格的符号,您可以强制C++为函数生成一个,方法是使用C++代码中的extern "C"为从C++调用的fortran函数的原型以及函数从Fortran中调用。

本例使用C编译器,但对于C++,您需要更改生成的符号(https://software.intel.com/en-us/node/691929#92BDCE7A-30FA-4A60-BCDB-7CE1521572EC)。请注意,C和Fortran的互操作性不是标准化的,通常不能从一个编译器集合移植到另一个编译器集合。我不得不处理Compaq编译器修改函数名称的问题,但不是以C++方式,或者PGI Fortran需要stdcall约定。

Fortran代码实施例

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 

C结构声明例

struct pass {int lenc, lenf; float *c, *f;}; 

C函数原型实施例

void simulation(long alpha, double *beta, 
    long *gamma, double delta[], struct pass *arrays); 

C调用序列实施例

simulation(alpha, &beta, &gamma, delta, &arrays);