2016-07-05 38 views
2

因此,我正在嘗試鏈接兩個簡單代碼,一個使用C++,另一個使用Fortran90。我已經花了最後幾天環顧網絡,我看到的一切使它看起來像我在做什麼應該工作,但我在這裏很明顯,它不是。下面是我有鏈接C++和Fortran90代碼時的錯誤

C++代碼:BasicFusion.cpp

#include <iostream> 
#include <fstream> 
using namespace std; 

extern "C" 
{ 
    void Fusion_(double *T, double *dens); 
} 

void Fusion_(double *T, double *dens) 
{ 
    double dT; 
    FILE *fp; 
    fp = fopen("Temp.dat","a"); 

    dT = *dens * 1.46e-9; 
    *T = *T + dT; 

    cout << "The new Temperature is: " << T << endl; 
    fprintf(fp, "%f \n" T); 
    fclose(fp); 
} 

Fortran代碼:BasicHydro.f90

program BasicHydro 
implicit none 

double precision :: R 
double precision :: rho 
double precision :: T = 1.0d4 
double precision :: M = 2.0d30 
double precision :: G = 6.67d-11 
double precision :: k = 1.381d-23 
double precision :: pi = 3.14159265359d0 
integer :: i 

do i=1,10,1 
    open(1,file='density.dat',action='write',position="append") 
    R = (75/(4*pi))*((k*T)/(G))**2 

    write(*,*) 'The new density is',rho 

    write(1,*) rho 
    close(1) 
    call Fusion(T,rho) 
end do 
end program BasicHydro 

在命令行我輸入:

>g++ -c BasicFusion.cpp 
>gfortran -c BasicHydro.f90 
>gfortran -o HydroThermo BasicFusion.o BasicHydro.o -lstdc++ 

我也用ifort代替gfortran使用相同的標籤和文件。在這兩種情況下,我得到了同樣的錯誤:

BasicHydro.o: In function `MAIN__': 
BasicHydro.f90:(.text+0x27d): undefined reference to `fusion_' 

我見過的已經取得了Fortran代碼到C++程序的引用的例子沒有,而他們已經使用了相同的結構,一切鋪陳。

+2

自己處理名稱表明您不熟悉Fortran *與C *功能的互操作性。在標籤'fortran-iso-c-binding'周圍捅一下,看看你能學到什麼。 –

+0

對所有Fortran問題使用標籤fortran。 Fortran 90已經很陳舊了。 –

+0

@VladimirF我多麼希望你完全正確。我當然希望F90是陳舊過時的,而不是這個「新奇」的東西,我和一個同事試圖慢慢地將我們公司的主要軌道傳播/軌跡優化工具移植到。這種出血邊緣的特徵就像模塊和用戶定義的類型一樣!不,我們最好繼續使用建立在大量COMMON變量之上的代碼庫(儘管我應該說至少它們被組織在包含文件中)。哦,這不是70年代的代碼,這是在2002年寫的。 –

回答

1

所以,我的顧問剛剛停下來,經過一些其他文檔後,似乎由於Fortran不依賴於案例,它會自動將所有內容都設置爲小寫。因爲我已經用大寫字母F定義了Fusion,所以C++對象文件將它與上面的F一起使用。所以當我試圖運行整個東西時,fortran部分正在尋找融合,而C++部分只有融合... ...

故事的寓意:所有的時間都要小寫。

+5

有時候大寫,有時候它會添加各種裝飾...使用'bind(C,name =)'保持便攜性。 –