2013-10-09 10 views
5

मैंने कुछ खोज ऑनलाइन की हैं लेकिन मुझे पता नहीं है कि लिनक्स से एक सरल सी ++ और फोरट्रान कोड कैसे संकलित किया जाए। मुझे इसके साथ जटिल होने की जरूरत है, लेकिन मुझे बस एक सरल उदाहरण के साथ शुरू करने की आवश्यकता है।मिश्रित सी ++ और फोरट्रान लिंकिंग समस्या

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

मेरे फोरट्रान कोड यह है::

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 उपयोग कर रहा हूँ मेरी फोरट्रान कोड और जी संकलित करने के लिए C++ के लिए ++ कोड

मेरे सी ++ कोड यह है। मैं इस टर्मिनल कमांड की कोशिश की है: "। लिंकर इनपुट फ़ाइल अप्रयुक्त क्योंकि नहीं किया लिंकिंग"

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

लेकिन त्रुटि मैं हो रही है कहते हैं मुझे यकीन नहीं है कि दोनों को एक साथ कैसे लिंक करें। अगर कोई मेरी मदद कर सकता है तो मैं इसकी सराहना करता हूं!

पीएस - मैंने अपनी संकलन रेखा के अंत में -lg2c जोड़ने का प्रयास किया है, और यह पहचाना नहीं गया है।

+2

आप 'g ++' गलत लगता है, 'g ++ -o Program.o Main.cpp –

+0

@ZacWrangler होना चाहिए, क्योंकि यह C++ 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"? देखें सबसे पहले, सी ++ कोड कि बाहरी कार्यों सी हस्ताक्षर में निर्दिष्ट करें।

अपने फोरट्रान कोड में, मॉड्यूल में प्रक्रियाओं को रखकर इंटरफेस को स्पष्ट करें, और iso_c_binding का उपयोग करें ताकि फोरट्रान ऑब्जेक्ट्स वैध सी ऑब्जेक्ट्स के रूप में दिखाई दे सकें। ध्यान दें कि हम स्पष्ट रूप से वस्तुओं है कि सी या सी ++ कार्यक्रमों 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 

संकलित (इंटेल सुइट का उपयोग करके मुझे कोई आपत्ति नहीं है , मेरे जी ++ & 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

संबंधित मुद्दे