2013-01-31 24 views
5

मैं कैमरे लाइब्रेरी को गतिशील रूप से लोड करने की कोशिश कर रहा हूं। इसलिए सरल कैमरा कार्यों तक पहुंच प्राप्त करने के लिए एक लिनक्स निष्पादन योग्य फ़ाइल में फ़ाइल करें।dlopen() का उपयोग कर .so पुस्तकालयों को एक्सेस करना अनिर्धारित प्रतीक त्रुटि

मैं कर ऐसा करते हैं करने के लिए प्रयास कर रहा हूँ:

if ((newHandle = dlopen("./libCamera.so",RTLD_LAZY | RTLD_GLOBAL)) == NULL) 
    { 
    printf("Could not open file : %s\n", dlerror()); 
    return 1; 
    } 

हालांकि इस विफल रहता है और मैं निम्नलिखित उत्पादन प्राप्त करते हैं: "नहीं किया जा सका फ़ाइल खोलने: libCamera.so: अपरिभाषित प्रतीक: ZTVN10 _cxxabiv117__class_type_infoE"

मैं कैसे पता लगा सकता हूं कि यह किस प्रतीक पर निर्भर है?

उत्तर

10

सबसे अधिक संभावना, libCamera.soकि पुस्तकालय के आधार पर बिना एक प्रतीक एक साझा लाइब्रेरी में परिभाषित का उपयोग करता है।

  1. एक अपराधी खोजें। एक वास्तविक निष्पादन योग्य लें जो libCamera.so (और यह काम करता है) के खिलाफ लिंक करता है। ldd /path/to/executable के साथ अपनी निर्भरताओं की सूची बनाएं। उनमें से एक लाइब्रेरी होनी चाहिए जिसमें ZTVN10_cxxabiv117__class_type_infoE की परिभाषा हो (grep का उपयोग संभावित उम्मीदवारों को चुनने के लिए, nm -D लाइब्रेरी पर सुनिश्चित करने के लिए)। वह लाइब्रेरी ldd ./libCamera.so द्वारा दिखाए गए सूची में नहीं होगी।

  2. एक समस्या हल करें। चरण 1 में dlopen पहले लाइब्रेरी लोड करें (वहां RTLD_GLOBAL का भी उपयोग करें)।

  3. अगर वहाँ एक और प्रतीक के साथ एक समस्या, गोटो कदम है 1.

  4. नव जोड़ा पुस्तकालयों एक ही समस्या भी, गोटो कदम है, तो 1.

  5. बताओ ठीक खुश करने के लिए पुस्तकालय लेखक अपनी जोड़ने।

यह भी हो सकता है कि ldd ./libCamera.so में आवश्यक शर्तें से एक उन्नत बनाया है और एक प्रतीक परिभाषा (शायद यह एक संकलक जो नाम को अलग ढंग से mangling करता है के साथ recompiled किया गया था) खो गया। तब आपको चरण 1 में अपराधी नहीं मिलेगा, और कोई समाधान नहीं है लेकिन कुछ फिर से डाउनग्रेड कर रहा है।

6

ldd कमांड साझा लाइब्रेरी निर्भरताओं को प्रदर्शित करने के लिए उपयोग किया जा सकता है।

ldd libCamera.so 

एक बार जब आप निर्भरता पता है, तुम nm का उपयोग प्रत्येक पुस्तकालय में प्रतीकों को दिखाने के लिए कर सकते हैं।

nm -DC libCamera.so 
+0

मैंने 'nm -DC libCamera.so' में सूचीबद्ध एक फ़ंक्शन देखा लेकिन यह अभी भी अपरिभाषित था। अंत में यह पता चला कि .h फ़ाइल में तर्कों में से एक का गठन था और .cpp में यह स्थिर नहीं था जिसके कारण इसे अपरिभाषित किया गया था। –

1

libCamera.so के लिए आपके स्रोत कोड में, आपके पास अनसुलझे बाहरी प्रतीक है। इसका मतलब है कि type_infoE आपके स्रोत कोड में कोई परिभाषा नहीं है और इसे हल किया जाना चाहिए।

2

मुझे एक ही समस्या थी। यह .a लाइब्रेरी के साथ करना था, जो मेरे .so से जुड़ा हुआ होना चाहिए और शेष रूप से संग्रहीत संग्रह में लिंक किया जाना चाहिए।

nm mylibrary.so | grep ZTVN10_cxxabiv117__class_type_infoE 
0000ABC0 U ZTVN10_cxxabiv117__class_type_infoE 

U यहाँ means that प्रतीक "अनिर्धारित" है:

मैं (ओपी वस्तु यहां इस्तेमाल किया नाम) के साथ इस निर्धारित। आप --demangle साथ लापता वस्तु की demangled नाम पा सकते हैं:

$ nm --demangle mylibrary.so | grep 0000ABC0 
0000ABC0 U abi::class_type_info(params...) 

(या ऐसा ही कुछ) इस मदद करनी चाहिए आप यह पता लगाने की जो पुस्तकालय याद आ रही है।

मेरे मामले में, कंपाइलर लाइन पर लाइब्रेरी समेत भी मुझे अभी भी समस्या थी। अंत में, कुछ फेरबदल के बाद मुझे पता चला कि पुस्तकालय फ़ाइल (.a) ने अपने निर्भर वस्तु (.o) के बाद आने के लिए है फ़ाइल की तरह:

$ nm --demangle mylibrary.so | grep 0000ABC0 
0000ABC0 T abi::class_type_info(params...) 
:

g++ -Wl,-E -g -m32 ... -fPIC myobjects1.o myobjects2.o missing_library.a -shared -o mylibrary.so 

अब मैं (कोई अधिक U) मिलता है

और सबसे महत्वपूर्ण बात यह है कि मुझे अब त्रुटि नहीं मिल रही है!

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

  • कोई संबंधित समस्या नहीं^_^