2013-10-09 20 views
5

Bazı aramaları çevrimiçi yaptım, ancak Linux'tan basit bir C++ ve Fortran kodunu nasıl derleyeceğimi bulamıyorum. Bununla karmaşıklaşmam gerek ama basit bir örnekle nasıl başlayacağımı bilmem gerek. Karma C++ ve Fortran Bağlama Sayı

#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; 
} 

Benim Fortran Kanunu

şudur: Ben Fortran kodu ve g derlemek için ifort kullanıyorum

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++ için kod

Benim C++ kod budur. Bu uç komutu denedim: "bağlayıcı girdi dosyası kullanılmayan çünkü yapmadı Bağlama işlemi"

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

Ama alıyorum hata diyor İkisini birbirine nasıl bağlayacağımı bilmiyorum. Birisi bana yardım edebilirse, çok memnun olurum!

PS - Derleme satırımın sonuna -lg2c eklemeyi denedim ve tanınmadı.

+2

you 'g ++' yanlış görünüyorsa, g ++ -o Program.o olmalıdır. Main.cpp –

+0

@ZacWrangler Bu, C++ Program.o daha önce yerleşik Fortran Program.o üzerine yazacaktır çünkü olmamalıdır. Aksine, farklı nesne dosya adları var. – milancurcic

cevap

8

Nesnelerin adlarının eşleşmesine izin vermeyen birkaç sorun var.

Test.cpp:

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

fazla ayrıntı için In C++ source, what is the effect of extern "C"? bakınız Birincisi, dış fonksiyonlar C imzaya sahip C++ kodunda belirtin.

Fortran kodunuzda, modüle yordamlar yerleştirerek arabirimi açık hale getirin ve Fortran nesnelerinin geçerli C nesneleri olarak görünmesini sağlamak için iso_c_binding kullanın. Biz açıkça C veya C++ programları bind anahtar kelime görecek nesnelerin adlarını belirtebilirsiniz dikkat edin:

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 

Derleme (Intel paketini kullanarak bana aldırma benim g ++ & gfortran) çok eski:

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

Bağlantı:

$ icpc test_f.o test.o 

a.out Yürütülmesi şimdi beklendiği gibi çalışmalıdır.

+0

Çok teşekkür ederim bir şampiyon gibi çalıştı! – user2863626

+1

'iso_c_binding işlevini kullan 'ifadesi, sunulan kod için gereksizdir - bu modülden hiçbir öğeye erişilemiyor. – IanH

+0

@IanH Ah Bunun farkında değildim. Yedekliği kaldırmak için kodu düzenledim :). – milancurcic