2010-05-07 19 views
9

मैं एक पुस्तकालय है कि एक द्विआधारी lib (ए) और हेडर के रूप में वितरित किया जाता है लिया है मैक ओएस पर dlopen के साथ समस्याओं, इसके खिलाफ कुछ C++ कोड लिखा है, और एक अजगर में परिणाम लपेट करना चाहते हैं मॉड्यूल।अजगर सी विस्तार,

मैं इस here किया है।

समस्या है जब (मैं 10.5 और 10.6 की कोशिश की है) पर मैक OSX इस मॉड्यूल का आयात, मैं निम्नलिखित त्रुटि मिलती है कि:

dlopen(/Library/Python/2.5/site-packages/dirac.so, 2): Symbol not found: _DisposePtr 
    Referenced from: /Library/Python/2.5/site-packages/dirac.so 
    Expected in: dynamic lookup 

यह कार्बन ढांचे में परिभाषित प्रतीकों की तरह लग रहा नहीं कर रहे हैं ठीक तरह से हल किया जा रहा है, लेकिन मुझे यकीन नहीं है कि इसके बारे में क्या करना है। मैं -framework Carbondistutil.core.Extension के extra_link_args पैरामीटर की आपूर्ति कर रहा हूं, इसलिए मुझे यकीन नहीं है कि मुझे और क्या करना चाहिए।

किसी भी मदद की बहुत सराहना की जाएगी।

अद्यतन:

संकलन setup.py द्वारा उत्पन्न लाइन इस तरह दिखता है:

gcc -fno-strict-aliasing -Wno-long-double -no-cpp-precomp -mno-fused-madd -fno-common -dynamic -DNDEBUG -g -Os -Wall -Wstrict-prototypes -DMACOSX -I/usr/include/ffi -DENABLE_DTRACE -arch i386 -arch ppc -pipe -Isource -I/System/Library/Frameworks/Python.framework/Versions/2.5/Extras/lib/python/numpy/core/include -I/System/Library/Frameworks/Python.framework/Versions/2.5/Extras/lib/python/numpy/numarray -I/usr/lib/python/2.5/site-packages/numpy/numarray/numpy -I/usr/lib/python/2.5/site-packages/numpy/numarray -I/usr/lib/python/2.5/site-packages/numpy/core/include -I/System/Library/Frameworks/Python.framework/Versions/2.5/include/python2.5 -c source/Dirac_LE.cpp -o build/temp.macosx-10.5-i386-2.5/source/Dirac_LE.o 

लिंकर लाइन इस तरह दिखता है:

g++ -Wl,-F. -bundle -undefined dynamic_lookup -arch i386 -arch ppc build/temp.macosx-10.5-i386-2.5/diracmodule.o build/temp.macosx-10.5-i386-2.5/source/Dirac_LE.o -Llibs/MacOSX -lDiracLE -o build/lib.macosx-10.5-i386-2.5/dirac.so -framework Carbon 

otool रिपोर्ट:

dirac.so: 
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.4.0) 
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0) 
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.5) 

अद्यतन 2: MacOS 10.5 पर, RTLD_LAZY को RTLD_NOW के डिफ़ॉल्ट से dlopen झंडे को संशोधित समस्या का हल। हालांकि, यह मैक ओएस 10.6 पर काम नहीं करता है।

10.6 पर, निम्न क्रम हालांकि मुझे यकीन है कि क्यों नहीं कर रहा हूँ, पुस्तकालय ठीक से चलाने के लिए अनुमति देता है:

  1. अजगर setup.py निर्माण -v
  2. लिंकर लाइन को चलाने (द्वारा सांत्वना देने मुद्रित setup.py) फिर से, मैन्युअल रूप से।
  3. अजगर

मैं अभी भी यह कैसे ठीक से काम करने के लिए के रूप में एक अच्छा जवाब के लिए देख रहा हूँ स्थापित setup.py। धन्यवाद!

+1

वास्तविक संकलक क्या है कमांडलाइन जो setup.py निष्पादित करता है? 'बिल्ड' निर्देशिका हटाएं और देखने के लिए' setup.py build -v' चलाएं। इसके अलावा, 'otool -L'' dirac.so' फ़ाइल के बारे में क्या कहता है? –

+0

@ थॉमस, मैंने उस जानकारी के साथ प्रश्न अपडेट किया है, धन्यवाद। –

+0

यह ठीक दिखता है; -फ्रेमवर्क तर्क संभावित स्थान पर है।केवल एक चीज जो मैं कल्पना कर सकता हूं वह यह है कि आपको एक अलग ढांचे की आवश्यकता है, या ढांचा को श्लिब निर्भरता पेश करना है और किसी भी तरह से नहीं है (मुझे नहीं पता कि कार्बन ढांचे को ऐसा करना है या नहीं।) –

उत्तर

4

जब आप इसका जवाब देखते हैं तो आप खुद को लात मारने जा रहे हैं!

link_args = ['-framework Carbon'] if platform == 'Darwin' else [] 
इस के लिए

: इस बदलने का प्रयास करें

link_args = ['-framework', 'Carbon'] if platform == 'Darwin' else [] 

एक बार मैं इस परिवर्तन मैं एक साफ निर्माण मॉड्यूल सीधे करते हैं और आयात करने में सक्षम था :)

+0

अविश्वसनीय। धन्यवाद! –

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