osx - "Couldn't find function symbol in library" - JS-Ctypes -
मेरी सी ++ लाइब्रेरी फ़ंक्शन है कोड अंतिम पंक्ति पर एक अपवाद फेंकता है। यह कहते हैं, " लायब्रेरी ओएस एक्स पर i386 और x86_64 (लेकिन पीपीसी कट्टर नहीं) दोनों में एक "वसा डिलिब बाइनरी" है शेर (10.7) फ़ायरफ़ॉक्स संस्करण 11। बेहद मदद की ज़रूरत है धन्यवाद। ज्यादातर यूनिक्स प्लेटफार्मों में, ओएस एक्स, सी फ़ंक्शंस में प्रतीकों के साथ प्रीफिक्सिंग द्वारा प्रतीकों के लिए मैप किया जाता है। एक अंडरस्कोर, इसलिए लेकिन वह C ++ के लिए काम नहीं करता है, क्योंकि सी ++ में, आप एक ही नाम के साथ दो अलग-अलग कार्य हो सकते हैं, विभिन्न प्रकार के विभिन्न तरीकों से आप जेएसटीटीपी जानता है कि _ बंद दस्तक, लेकिन यह नहीं जान सकता कि कैसे अपने कार्य को हल करने के लिए, क्योंकि आप इसे सिर्फ एक नाम दे रहे हैं, पूर्ण प्रोटोटाइप नहीं। इसलिए, आपको किसी अन्य तरीके से यह पता लगाना होगा कि आपके फ़ंक्शन का गड़बड़ नाम नामों के गड़बड़ होने के लिए कोई पोर्टेबल मानक नहीं है। हालांकि, सी + + एबी जो ऐप्पल का उपयोग करता है, उस पर आधारित है, जिसे सी ++ फ़ंक्शंस उलझाने और गड़बड़ी करने के लिए एपीआई की आवश्यकता होती है। Xcode को c ++ filt नामक एक उपकरण के साथ आता है जो कि कमांड लाइन पर उपयोग करने के लिए उस एपीआई को लपेटता है लेकिन यह केवल मस्तूल को संभालता है, मैंगलिंग नहीं करता है। इसलिए, यह आपको बता सकता है कि एक तरीका Mangled नाम के साथ शुरू करने के लिए है एक और तरीका है कि स्वचालित है इस तरह से कुछ: <पूर्व> एक ?? | आपके सभी प्रतीकों के दिवालिया नाम मुद्रित करेगा। लेकिन संभवत: इसके बारे में जाने का सबसे अच्छा तरीका उस सीपीपी फ़ाइल को बनाना है, जिसमें उसमें कुछ भी नहीं है, लेकिन एक प्रोटोटाइप, इसे संकलित करें, और "ओटोओल-एसवी छोटे। ए" का उपयोग करें, जो गड़बड़ नाम देखने के लिए है। / P> अतः, C ++ फ़ंक्शन जिसे आप कॉल करना चाहते हैं के प्रतीक के नाम को प्राप्त करना कठिन नहीं है। लेकिन इसका यह अर्थ नहीं है कि आप इसे बस के रूप में कॉल कर सकते हैं सी फंक्शन एक सुंदर स्पष्ट उदाहरण के लिए, यदि आप (गैर-स्थैतिक) Foo :: bar (int) कॉल करना चाहते हैं, तो आपको "यह" सूचक के रूप में पारित करने के लिए एक वैध वस्तु होगी, और इसे कैसे पारित करना होगा मोज़िला में jsctypes क्या नहीं कर सकते, और क्यों। विवरण के लिए देखें। int आरएफडी_स्टार्टबैकग्रीथथ्रेड () मेरा कोड
overlay.js है <पूर्व>
यूरी = एडऑन.जेटरेसोसुरिय ("घटक / मैक / libReverbFirefoxExtensionLib.dylib"); This.extensionLib = ctypes.open (uri.path); This.startBackgroundThread = this.extensionLib.declare ("आरएफडी_बैंकफ्रंटफ्रेड", ctypes.default_abi, ctypes.unsigned_int);
पुस्तकालय में फ़ंक्शन प्रतीक नहीं मिल पाया "।
int foo (int) को सिर्फ
_foo के रूप में समाप्त होता है।
int foo (int) और
डबल फू (डबल) , या
int MyClass :: foo (int) , या
int foo & lt; int & gt; (int) , और इसी तरह। इसलिए, सी + + फ़ंक्शंस को एक अद्वितीय स्ट्रिंग देने के लिए "" होना चाहिए। (और फिर, उस अद्वितीय स्ट्रिंग को सी फ़ंक्शन के रूप में माना जाता है, जो कि "_" के साथ प्रीफ़ेक्स्ड है।)
_Z25RFD_startBackgroundThreadv है।
_Z25RFD_startBackgroundThreadv का अर्थ
आरएफडी_स्टार्टबैकग्रेडथाफ्रेड () है, लेकिन इसे दूसरी तरह से नहीं मिल सकता है।
nm libfoo.dylib , फिर c ++ filt का उपयोग करें जो कि अच्छे उम्मीदवारों की तरह दिखते हैं, जब तक कि आप उस प्रोटोटाइप से मेल खाने वाला नहीं पाते।
एनएम। Libfoo.dylib | Awk 'एनएफ == 2 {printf "% s", $ 1; सिस्टम ("c ++ filt" $ 2)} NF! = 2 {print $ 0} '
Comments
Post a Comment