2013-10-09 86 views
5

我在網上做了一些搜索,但是我找不到如何從linux編譯一個簡單的C++和Fortran代碼。我需要複雜一些,但我只需要知道如何從一個簡單的例子開始。混合C++和Fortran鏈接問題

我的C++代碼是這樣的:

#include <iostream> 
using namespace std; 

extern int Add(int *, int *); 
extern int Multiply(int *, int *); 

int main() 
{ 
    int a,b,c; 
    cout << "Enter 2 values: "; 
    cin >> a >> b; 

    c = Add(&a,&b); 
    cout << a << " + " << b << " = " << c << endl; 
    c = Multiply(&a,&b); 
    cout << a << " * " << b << " = " << c << endl; 
    return 0; 
} 

我的Fortran代碼是這樣的:

integer function Add(a,b) 
    integer a,b 
    Add = a+b 
    return 
end 


integer function Multiply(a,b) 
    integer a,b 
    Multiply = a*b 
    return 
end 

我使用ifort編譯我Fortran代碼和g ++中的C++代碼。我試過這個終端命令:

$ ifort -c Program.f90 
$ g++ -o Main.cpp Program.o 

但我得到的錯誤說「鏈接器輸入文件未使用,因爲鏈接沒有完成」。 我不知道如何將兩者聯繫在一起。如果有人能幫助我,我將不勝感激!

PS - 我已經嘗試在我的編譯行末尾添加-lg2c,並且它不被識別。

+2

您'g ++'看起來不對,應該是'g ++ -o Program.o Main.cpp –

+0

@ZWWrangler它不應該,因爲C++ Program.o會覆蓋以前生成的Fortran Program.o。相反,有不同的目標文件名稱。 – milancurcic

回答

8

這裏有很少的問題,不要讓對象的名稱匹配。首先,指定在C++代碼,外部函數具有Ç簽名:

在TEST.CPP:

extern "C" int Add(int *, int *); 
extern "C" int Multiply(int *, int *); 

詳情請參閱In C++ source, what is the effect of extern "C"?

在Fortran代碼中,通過在模塊中放置過程使界面顯式化,並使用iso_c_binding使Fortran對象顯示爲有效的C對象。請注意,我們可以明確指定C或C++程序將通過bind關鍵字看清物體的名稱:

test_f.f90:

module mymod 
use iso_c_binding 
implicit none 

contains 

integer(kind=c_int) function Add(a,b) bind(c,name='Add') 
    integer(kind=c_int) :: a,b 
    Add = a+b 
end function 

integer(kind=c_int) function Multiply(a,b) bind(c,name='Multiply') 
    integer(kind=c_int) :: a,b 
    Multiply = a*b 
end function 

endmodule mymod 

編譯(採用英特爾套房不介意我,我的G ++ & gfortran是很老):

$ ifort -c test_f.f90 
$ icpc -c test.cpp 

鏈接:

$ icpc test_f.o test.o 

執行a.out現在應按預期工作。

+0

非常感謝你像冠軍一樣工作! – user2863626

+1

請注意'使用iso_c_binding'語句對於代碼是多餘的 - 沒有來自該模塊的實體正在被訪問。 – IanH

+0

@IanH啊我沒有意識到這一點。我編輯了代碼,以消除冗餘:)。 – milancurcic