2010-02-24 11 views
18

लिनक्स पर, मेरे पास एक साझा लाइब्रेरी है जो अन्य libs पर निर्भर करती है। LD_LIBRARY_PATH लिंकर को सभी पुस्तकालयों को लोड करने की अनुमति देने के लिए ठीक से सेट किया गया है। जब मैं कार्य करें:ctypes एक साझा साझा लाइब्रेरी लोड कर रहा है जिसमें निर्भरता

libgidcwf = ctypes.cdll.LoadLibrary(libidcwf_path) 

मैं निम्नलिखित त्रुटि मिलती है:

Traceback (most recent call last): 
    File "libwfm_test.py", line 12, in <module> 
    libgidcwf = ctypes.cdll.LoadLibrary(libidcwf_path) 
    File "/usr/lib/python2.5/ctypes/__init__.py", line 431, in LoadLibrary 
    return self._dlltype(name) 
    File "/usr/lib/python2.5/ctypes/__init__.py", line 348, in __init__ 
    self._handle = _dlopen(self._name, mode) 
OSError: path-to-my-lib/libwav.so: undefined symbol: ODBCGeneralQuery 

ऐसा लगता है कि LD_LIBRARY_PATH यहाँ कोई प्रभाव नहीं है। क्या इन निर्भरता पुस्तकालय को "लोड करने योग्य" रखने का कोई तरीका है?

सहायता के लिए अग्रिम धन्यवाद।

+0

आप किस ओएस पर हैं? Http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html देखें - यह एचपीयूएक्स में 'SHLIB_PATH' है, ऐक्स में' LIBPATH', मैक पर 'DYLD_lotsofthings' ... semantics भी अलग-अलग हैं। यहां तक ​​कि यदि लिनक्स, कृपया संस्करण को स्पष्ट करें और अपने क्यू को उचित रूप से टैग करें, धन्यवाद! –

+1

मैं लिनक्स पर हूं इसलिए मैं एलडी_LIBRARY_PATH का उपयोग करता हूं लेकिन ऐसा लगता है कि यह ctypes – zoobert

उत्तर

15

ऐसा प्रतीत होता है कि libwav.so ओडीबीसीजीQueryQuery परिभाषित लाइब्रेरी पर इसकी निर्भरता घोषित नहीं करता है। ldd path-to-my-lib/libwav.so चलाने का प्रयास करें और देखें कि कुछ गुम है या नहीं। यदि यह एक साझा लाइब्रेरी है जिसे आप बना रहे हैं तो आपको लाइब्रेरी के कोड का उपयोग करने वाली प्रत्येक लाइब्रेरी के लिए लिंकिंग कमांड (gcc -shared -o libwav.so a.o b.o c.o जैसा कुछ है) में -llibname जोड़ना चाहिए। इस तरह से मूल साझा लाइब्रेरी द्वारा संदर्भित किसी अन्य पुस्तकालय को स्वचालित रूप से भी लोड किया जाना चाहिए।

+0

द्वारा उपयोग नहीं किया जा रहा है यदि आप "कुछ याद आ रही" पर विस्तृत जानकारी देंगे तो मैं बहुत सराहना करता हूं। मैं अपने .s पर ldd चलाता हूं - लेकिन मुझे क्या देखना चाहिए? – Bex

+0

मुझे लगता है कि मेरा अर्थ अस्पष्ट है। मेरा मतलब था कि ldd पुस्तकालयों को दिखाएगा कि libwav.so संदर्भ और यह देखने के लिए निरीक्षण किया जाना चाहिए कि कोई पुस्तकालय है जो सूचीबद्ध होना चाहिए लेकिन नहीं। –

+0

वास्तव में इस चार साल के पुराने उत्तर को स्पष्ट करने के लिए आपको बहुत बहुत धन्यवाद। मुझे 'ldd' से आउटपुट थोड़ा उलझन में मिलता है, लेकिन आपका उत्तर इसे स्पष्ट करने में मदद करता है। धन्यवाद। – Bex

4

आपको RTLD_GLOBAL का उपयोग करना चाहिए। मैं एक मिश्रित मंच प्रणाली है, इसलिए मेरे कोड इस तरह दिखता है:

import numpy, ctypes 
try: 
    if "Linux" in esmfos: 
    _ESMF = ctypes.CDLL(libsdir+'/libesmf.so',mode=ctypes.RTLD_GLOBAL) 
    else: 
    _ESMF = numpy.ctypeslib.load_library('libesmf',libsdir) 
except: 
    traceback.print_exc(file=sys.stdout) 
    sys.exit(ESMP_ERROR_SHAREDLIB) 
5

जब आप साझा वस्तु संकलन, स्ट्रिंग आदेश के अंत में सभी -lsomething डाल करने के लिए सुनिश्चित करें। मेरे लिए यह समस्या हल हो गई।

3

मुझे एक ही समस्या थी। दो बातें यह हल करने के लिए आवश्यक थे:

  1. उपयोग RTLD_GLOBAL अन्य उपयोगकर्ताओं के रूप में कहा
  2. आप हर पुस्तकालय है जो आपके लाइब्रेरी द्वारा प्रयोग किया जाता है लोड करने के लिए की जरूरत है। तो अगर ODBCGeneralQuery में परिभाषित किया गया है libIDCodbc कहना की सुविधा देता है, आपको पहले इस लाइन को चलाने की जरूरत है: एक अपरिभाषित प्रतीक है कि जुड़ा हुआ नहीं था, क्योंकि यह नहीं किया जा रहा था की वजह से

ctypes.CDLL("libIDCodbc.so", mode = ctypes.RTLD_GLOBAL)

2

मैंने पाया मैं RTLD_LAZY का इस्तेमाल करना पड़ा । के बाद से वहाँ मेरी ctypes में कोई ctypes.RTLD_LAZY, मैं का इस्तेमाल किया था:

ctypes.CDLL(libidcwf_path, mode=1) 

मैं /usr/include/bits/dlfcn.h निरीक्षण जो शायद मानक नहीं है द्वारा इस विधा पाया। Ctypes मेलिंग सूची पर इस 2006 thread पर हैट टिप।

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