2009-07-17 7 views
15

मेरे पास एक साझा ऑब्जेक्ट है (एक - विंडोज़ डीएलएल के लिनक्स समकक्ष) कि मैं अपने टेस्ट कोड के साथ आयात और उपयोग करना चाहता हूं।मैं सी ++ में साझा ऑब्जेक्ट कैसे लोड करूं?

मुझे यकीन है कि यह इस सरल नहीं है कर रहा हूँ;) लेकिन इस बात की तरह मैं क्या करना चाहते हैं है ..

#include "headerforClassFromBlah.h" 

int main() 
{ 
    load("blah.so"); 

    ClassFromBlah a; 
    a.DoSomething(); 
} 

मुझे लगता है कि यह एक बहुत ही बुनियादी सवाल है, लेकिन मैं नहीं कर सकता वेब पर खोज करने पर मुझे कुछ भी मिल जाए।

+0

शायद मैं उलझन में हूं लेकिन ऐसा नहीं लगता कि आपके पास पर्याप्त जानकारी है। उदाहरण के लिए, blah.so क्या है? आप निश्चित रूप से एक संदर्भ का उपयोग करने के बारे में बात नहीं कर रहे हैं? – Goz

+0

वास्तव में "साझा" से आपका क्या मतलब है? – Klaim

+0

एर ... इसलिए फ़ाइलें कोड फाइल नहीं हैं, है ना? शायद आप एक ऑब्जेक्ट को पुनः प्राप्त करना चाहते हैं।तो (साझा पुस्तकालय) फ़ाइल? – Klaim

उत्तर

33

वहाँ सी में वस्तुओं लोड हो रहा है साझा ++

इन तरीकों तुम हमेशा वस्तु का उपयोग करना चाहते के लिए हेडर फ़ाइल की आवश्यकता होगी दोनों में से किसी के लिए के दो तरीके हैं। शीर्षलेख में कक्षाओं या वस्तुओं की परिभाषाएं शामिल होंगी जिन्हें आप अपने कोड में उपयोग करना चाहते हैं।

स्थिरता

:

#include "blah.h" 
int main() 
{ 
    ClassFromBlah a; 
    a.DoSomething(); 
} 

gcc yourfile.cpp -lblah 

गतिशील रूप से (लिनक्स में): dlopen Linux man page प्रक्रिया से

#include <stdio.h> 
#include <stdlib.h> 
#include <dlfcn.h> 
int main(int argc, char **argv) { 
    void *handle; 
    double (*cosine)(double); 
    char *error; 
    handle = dlopen ("libm.so", RTLD_LAZY); 
    if (!handle) { 
     fprintf (stderr, "%s\n", dlerror()); 
     exit(1); 
    } 
    dlerror(); /* Clear any existing error */ 
    cosine = dlsym(handle, "cos"); 
    if ((error = dlerror()) != NULL) { 
     fprintf (stderr, "%s\n", error); 
     exit(1); 
    } 
    printf ("%f\n", (*cosine)(2.0)); 
    dlclose(handle); 
    return 0; 
} 

* चोरी खिड़कियों के तहत या किसी अन्य मंच, एक ही है बस प्लेटफार्मों संस्करण के साथ dlopen की जगह गतिशील प्रतीक खोज के।

काम करने के लिए गतिशील विधि के लिए, आप जिन सभी प्रतीकों को आयात/निर्यात करना चाहते हैं, उन्हें बाहरी सी लिंकेज होना चाहिए।

कुछ शब्द Here हैं जब स्थिर और गतिशील लिंकिंग का उपयोग कब करें।

+5

+1। हो सकता है कि एक स्पष्ट उल्लेख के लायक हो कि डलोपेन पॉज़िक्स है, सी या सी ++ नहीं। कुछ प्लेटफॉर्म पर कोई गतिशील लोडिंग नहीं होती है, लेकिन वे अभी भी सी ++ कार्यान्वयन को अनुरूप बना रहे हैं। –

+0

इस फ़ाइल को बनाने का आदेश क्या है, g ++ filename.cpp -L कुछ शामिल है -0 फ़ाइल काम? –

+0

आपको -ldl का उपयोग करके भी लिंक करना होगा –

4

यह मंच पर निर्भर करता है। रनटाइम पर इसे करने के लिए, लिनक्स पर, आप dlopen का उपयोग विंडोज़ पर करते हैं, आप LoadLibrary का उपयोग करते हैं।

संकलन समय पर ऐसा करने के लिए, विंडोज़ पर आप dllexport और dllimport का उपयोग करके फ़ंक्शन नाम निर्यात करते हैं। लिनक्स पर, जीसीसी सभी सार्वजनिक प्रतीकों का निर्यात करता है ताकि आप इसे सामान्य रूप से लिंक कर सकें और फ़ंक्शन को कॉल कर सकें। दोनों मामलों में, आम तौर पर इसके लिए आपको हेडर फ़ाइल में प्रतीक का नाम होना आवश्यक होता है, जिसे आप #include करते हैं, फिर आप अपने कंपाइलर की सुविधाओं का उपयोग करके लाइब्रेरी से लिंक करते हैं।

3

आपको क्लासफ्रॉमब्लैह जैसी चीजों की घोषणा करने के लिए साझा लाइब्रेरी से जुड़े किसी भी शीर्षलेख को शामिल करना होगा।

g++ myfile.cpp -lblah 

शायद काम करेगा: जी के लिए ++ कुछ की तरह आप इस अपने संकलक और सामान्य instalation पर निर्भर करता है वास्तव में कैसे करते हैं, लेकिन - इसके बाद आप .so के खिलाफ लिंक करना होगा।

+0

मैंने हेडर शामिल किए हैं और मैं अपने ऑब्जेक्ट को साझा ऑब्जेक्ट के साथ संकलित और लिंक कर सकता हूं लेकिन मुझे नहीं पता कि इसका उपयोग कैसे किया जाए और इसमें कौन से वर्ग शामिल हैं - मैंने यह स्पष्ट नहीं किया है, कोड स्निपेट में मेरा अपडेट देखें। कोई विचार? –

+1

इसमें शामिल कक्षाओं का उपयोग करने के तरीके के रूप में, आपको आरटीएफएम करना है, मुझे डर है। –

+0

@neil शायद यह समाधान है कि बेन की जरूरत है ... dlopen स्वीकृत उत्तर केवल शुरुआती प्रश्न (बेन?) की गलत व्याख्या हो सकता है ... @ बेन एल: यदि आपको नहीं पता कि इसमें क्या है। तो आपको dlsym के साथ इसका उपयोग करने में समस्या होगी ;-) – neuro

0

यह -l है जो संग्रह फ़ाइल को libblah.a से लिंक करता है या यदि आप जीसीसी में -पीआईसी जोड़ते हैं तो आपको 'साझा ऑब्जेक्ट' फ़ाइल libblah.so मिल जाएगी (यह लिंकर है जो इसे बनाता है)। मेरे पास एक बार एक बार था और इस प्रकार की फाइलें बनाई हैं। फ़ाइलों में एक संशोधन संख्या हो सकती है जो सटीक या उच्च होनी चाहिए (कोड बग के कारण बदल सकता है)। लेकिन पैरामीटर के साथ कॉल आउटपुट की तरह होना चाहिए।

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