2013-10-09 11 views
5

私はオンラインで検索しましたが、単純なC++やFortranのコードをlinuxからコンパイルする方法を見つけることができません。私はそれと複雑になる必要がありますが、私は単純な例から始める方法を知る必要があります。混在した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 

私はC++コードのための私のFortranコードとg ++をコンパイルするifortを使用しています。私はこの端末コマンドを試しました:

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

しかし、私は "リンクが完了していないためにリンカー入力ファイルが未使用です"と言うエラーが発生しています。 2つをリンクする方法がわかりません。誰かが私を助けてくれたら嬉しいです!

PS - コンパイル行の最後に-lg2cを追加しようとしましたが、認識されません。

+2

あなたは 'g ++'が間違っているように見えます。 'g ++ -o Program.o Main.cpp –

+0

@ZacWrangler C++ Program.oは以前ビルドされたFortran Program.oを上書きするので、そうしてはいけません。むしろ、異なるオブジェクトファイル名を使用してください。 – milancurcic

答えて

8

ここでは、オブジェクトの名前が一致しないようにする問題はほとんどありません。

TEST.CPPにおいて:

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

詳しくはIn C++ source, what is the effect of extern "C"?を見るまず、外部関数は、Cの署名を有する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

'use iso_c_binding'ステートメントは、提示されているコードには余計ですが、そのモジュールのエンティティにはアクセスしていません。 – IanH

+0

@IanHああ私はそれを認識しませんでした。私は冗長性を削除するコードを編集:)。 – milancurcic

関連する問題