osx - "Couldn't find function symbol in library" - JS-Ctypes -


मेरी सी ++ लाइब्रेरी फ़ंक्शन है int आरएफडी_स्टार्टबैकग्रीथथ्रेड () मेरा कोड overlay.js है <पूर्व> यूरी = एडऑन.जेटरेसोसुरिय ("घटक / मैक / libReverbFirefoxExtensionLib.dylib"); This.extensionLib = ctypes.open (uri.path); This.startBackgroundThread = this.extensionLib.declare ("आरएफडी_बैंकफ्रंटफ्रेड", ctypes.default_abi, ctypes.unsigned_int);

कोड अंतिम पंक्ति पर एक अपवाद फेंकता है। यह कहते हैं, " पुस्तकालय में फ़ंक्शन प्रतीक नहीं मिल पाया "।

लायब्रेरी ओएस एक्स पर i386 और x86_64 (लेकिन पीपीसी कट्टर नहीं) दोनों में एक "वसा डिलिब बाइनरी" है शेर (10.7) फ़ायरफ़ॉक्स संस्करण 11।

बेहद मदद की ज़रूरत है धन्यवाद। ज्यादातर यूनिक्स प्लेटफार्मों में, ओएस एक्स, सी फ़ंक्शंस में प्रतीकों के साथ प्रीफिक्सिंग द्वारा प्रतीकों के लिए मैप किया जाता है।

एक अंडरस्कोर, इसलिए int foo (int) को सिर्फ _foo के रूप में समाप्त होता है।

लेकिन वह C ++ के लिए काम नहीं करता है, क्योंकि सी ++ में, आप एक ही नाम के साथ दो अलग-अलग कार्य हो सकते हैं, विभिन्न प्रकार के विभिन्न तरीकों से आप int foo (int) और डबल फू (डबल) , या int MyClass :: foo (int) , या int foo & lt; int & gt; (int) , और इसी तरह। इसलिए, सी + + फ़ंक्शंस को एक अद्वितीय स्ट्रिंग देने के लिए "" होना चाहिए। (और फिर, उस अद्वितीय स्ट्रिंग को सी फ़ंक्शन के रूप में माना जाता है, जो कि "_" के साथ प्रीफ़ेक्स्ड है।)

जेएसटीटीपी जानता है कि _ बंद दस्तक, लेकिन यह नहीं जान सकता कि कैसे अपने कार्य को हल करने के लिए, क्योंकि आप इसे सिर्फ एक नाम दे रहे हैं, पूर्ण प्रोटोटाइप नहीं। इसलिए, आपको किसी अन्य तरीके से यह पता लगाना होगा कि आपके फ़ंक्शन का गड़बड़ नाम _Z25RFD_startBackgroundThreadv है।

नामों के गड़बड़ होने के लिए कोई पोर्टेबल मानक नहीं है। हालांकि, सी + + एबी जो ऐप्पल का उपयोग करता है, उस पर आधारित है, जिसे सी ++ फ़ंक्शंस उलझाने और गड़बड़ी करने के लिए एपीआई की आवश्यकता होती है। Xcode को c ++ filt नामक एक उपकरण के साथ आता है जो कि कमांड लाइन पर उपयोग करने के लिए उस एपीआई को लपेटता है लेकिन यह केवल मस्तूल को संभालता है, मैंगलिंग नहीं करता है। इसलिए, यह आपको बता सकता है कि _Z25RFD_startBackgroundThreadv का अर्थ आरएफडी_स्टार्टबैकग्रेडथाफ्रेड () है, लेकिन इसे दूसरी तरह से नहीं मिल सकता है।

एक तरीका Mangled नाम के साथ शुरू करने के लिए है nm libfoo.dylib , फिर c ++ filt का उपयोग करें जो कि अच्छे उम्मीदवारों की तरह दिखते हैं, जब तक कि आप उस प्रोटोटाइप से मेल खाने वाला नहीं पाते।

एक और तरीका है कि स्वचालित है इस तरह से कुछ: <पूर्व> एनएम। Libfoo.dylib | Awk 'एनएफ == 2 {printf "% s", $ 1; सिस्टम ("c ++ filt" $ 2)} NF! = 2 {print $ 0} '

एक ?? | आपके सभी प्रतीकों के दिवालिया नाम मुद्रित करेगा।

लेकिन संभवत: इसके बारे में जाने का सबसे अच्छा तरीका उस सीपीपी फ़ाइल को बनाना है, जिसमें उसमें कुछ भी नहीं है, लेकिन एक प्रोटोटाइप, इसे संकलित करें, और "ओटोओल-एसवी छोटे। ए" का उपयोग करें, जो गड़बड़ नाम देखने के लिए है। / P>

अतः, C ++ फ़ंक्शन जिसे आप कॉल करना चाहते हैं के प्रतीक के नाम को प्राप्त करना कठिन नहीं है।

लेकिन इसका यह अर्थ नहीं है कि आप इसे बस के रूप में कॉल कर सकते हैं सी फंक्शन एक सुंदर स्पष्ट उदाहरण के लिए, यदि आप (गैर-स्थैतिक) Foo :: bar (int) कॉल करना चाहते हैं, तो आपको "यह" सूचक के रूप में पारित करने के लिए एक वैध वस्तु होगी, और इसे कैसे पारित करना होगा मोज़िला में jsctypes क्या नहीं कर सकते, और क्यों। विवरण के लिए देखें।

Comments

Popular posts from this blog

Python SQLAlchemy:AttributeError: Neither 'Column' object nor 'Comparator' object has an attribute 'schema' -

java - How not to audit a join table and related entities using Hibernate Envers? -

mongodb - CakePHP paginator ignoring order, but only for certain values -