2014-06-26 30 views
3

我有一個Fortran子程序,我想從C++程序調用。它需要的浮點參數的長列表,並使用ISO_C_BINDING內在模塊:從C++調用Fortran子程序,鏈接時未定義的參考

subroutine parasolve (......) bind (c, name='c_parasolve') 
    use,intrinsic :: iso_c_binding 
    implicit none 
.... 

基於我讀過,我明白,我需要使用C++的‘外部’命令之前定義的外部函數稍後再調用它。我嘗試了兩種方法。第一:

extern "C" void c_parasolve(....); 

收益「預期字符串之前不合格-ID常量」在編譯時,而第二:

extern void c_parasolve(....); 

編譯得很好,但失敗「未定義的引用「c_parasolve(鏈接....)'」和ld返回1

我與編譯:

g++ -c main.cpp 

等c和

gfortran -ffree-form -std=f2003 -c parasolve.f03 

,讓他們進入的.o的ELFs,然後嘗試與鏈接:

g++ main.o otherfiles.o parasolve.o -lgfortran 

什麼是調用此Fortran函數的正確方法?

+0

你有什麼命令來編譯和鏈接這段代碼? –

+0

我編輯它以顯示命令 – nathanvy

+0

,所以我認爲你在第一行得到上述錯誤。是G ++ -c main.cpp? – Ali786

回答

5

它看起來像你的extern "C"聲明是在一個函數或類定義。這是不允許的 - 它必須位於源文件的頂層。 (是的,錯誤信息可能會更豐富!)

+0

謝謝!感覺像一個doofus,認爲它必須在與它被調用的地方相同的範圍內聲明。 – nathanvy