2017-08-03 190 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);