2011-12-03 14 views
8

मुझे अपनी लाइब्रेरी को गतिशील रूप से लिंक करने की आवश्यकता है। मुझे बिल्कुल यकीन नहीं है कि समस्या क्या है। यह सब ठीक से संकलित, लेकिन मैं हमेशा NULL सूचक के रूप में handle पकड़ने:उचित उपयोग libdl और गतिशील रूप से जुड़े पुस्तकालय

void *handle; 
char *error; 
handle = dlopen ("./hw11-lib-michaelSchilling.so", RTLD_LAZY); 
//same error comes up with full path as well as './hw11...' 
if(!handle){ 
    error = dlerror(); 
    printf("%s\n", error); 
    printf("Error loading library.\n"); 
    exit(1); 
} 

मैं इस त्रुटि से पारित कर दिया हो नहीं कर सकते और मुझे यकीन है कि क्या संभवतः गलत हो सकता है नहीं कर रहा हूँ। मुझे पूरा यकीन है कि मैंने सब ठीक से संकलित किया है। यहाँ संकलन चरणों मैं प्रयोग किया जाता हैं:

gcc -rdynamic -c hw11-lib-michaelSchilling.c -o hw11-lib-michaelSchilling.so 
gcc hw11-michaelSchilling-4.c -ldl -o hw11-michaelSchilling-4 

मैं ऐसी त्रुटि

केवल ET_DYN और ET_EXEC लोड किया जा सकता हो रही है।

उत्तर

14

जब hw11-lib-michaelSchilling.so निर्माण, आप gcc कि आप एक साझा वस्तु चाहते कह जा करने के लिए प्रकट नहीं होते हैं (नाम में .so पर्याप्त नहीं है)।

-c यह एक वस्तु फ़ाइल का निर्माण कर रहा है और यह michaelSchilling.so बुला (नहीं एक वस्तु साझा)। लिंकर भी शामिल नहीं होता है। जब कोड यह खुलती के लिए पुस्तकालय संकलन मुझे लिनक्स पर के लिए

gcc -shared -rdynamic hw11-lib-michaelSchilling.c -o hw11-lib-michaelSchilling.so 
+0

'गतिशील' के साथ? बस इसे '-shared' के साथ और दोनों के साथ करने की कोशिश की, लेकिन मुझे एक ही त्रुटि मिली। –

+0

@MichaelSchilling: मुझे नहीं लगता कि '-गतिशील' समस्या के साथ कुछ भी करने के लिए है, तो आप इसे अपने कोड द्वारा आवश्यक होने पर भी रख सकते हैं। – NPE

+0

@MichaelSchilling: क्या आपने '-c' हटा दिया है? – NPE

0

hw11-lib-michaelSchilling.so आपकी फाइल सिस्टम की पूरी जड़ में है? आप दावा कर रहे हैं कि यह उस पर एक स्लैश का नेतृत्व कर रहा है ... लेकिन मुझे संदेह है कि यह नहीं है।

आपकी त्रुटि प्रबंधन में, विफलता के कारण को खोजने के लिए, आप जो प्रिंट करते हैं उसमें dlerror() का आउटपुट शामिल करें।

+0

hw11 की जरूरत है:

gcc कमांड लाइन से -c निकालें और जोड़ने -shared -lib-michaelSchilling.so: साझा ऑब्जेक्ट फ़ाइल नहीं खोल सकता: ऐसी कोई फ़ाइल या निर्देशिका मुझे जो त्रुटि मिलती है, लेकिन यह वही निर्देशिका है जिसे मैं चलाने की कोशिश कर रहा हूं। मैंने स्लैश भी हटा दिया। –

+0

यह देखने के लिए साझा ऑब्जेक्ट को पूर्ण पूर्ण पथ प्रदान करने का प्रयास करें कि क्या यह मदद करता है। – mah

+0

मैंने किया, और मुझे केवल ET_DYN और ET_EXEC लोड किया जा सकता है। –

1

एक स्लैश (/) पथ पथ के पहले चरित्र के रूप में इंगित करता है कि पथनाम पूर्ण (मूल निर्देशिका से संबंधित) है, वर्तमान कार्य निर्देशिका के सापेक्ष नहीं है और निश्चित रूप से बाइनरी के स्थान से संबंधित नहीं है। आपको बाइनरी के स्थान को ढूंढकर पूरा पथ निर्दिष्ट करना होगा (जो स्वयं में एक आसान समस्या नहीं है) या आप $ORIGINdlopen के साथ उपयोग करने में सक्षम हो सकते हैं (यह आरपीएथ के साथ काम करता है लेकिन मुझे अनिश्चितता है कि यह काम करता है या नहीं dlopen के साथ)।

+0

पथ से पहले की अवधि के बारे में क्या? ('। /') –

+0

यह वर्तमान कार्य निर्देशिका के सापेक्ष बनाता है, न कि आपके प्रोग्राम बाइनरी का स्थान। –

0
gcc -fPIC -shared -rdynamic library.c -o library.o 

काम करता है, तो आप -ldl

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