ios - रखरख - विद्यालय पुस्तकालय के नियम
Weakly लिंक के माध्यम से स्थैतिक पुस्तकालय-weak_library (0)
सवाल:
क्या यह एक स्थैतिक लाइब्रेरी (ओबजे-सी) को कमजोर रूप से लिंक करना संभव है?
लघु विवरण
मैं अपने कस्टम स्टैटिक फ्रेमवर्क ( MyFramework.framework ) को अपने अन्य कस्टम स्टैटिक लाइब्रेरी ( libMyLibrary.a ) से दुबले लिंक करने के लिए चाहता हूं।
LibMyLibrary.a के पीछे की कार्यक्षमता वैकल्पिक है और अगर कोई libMyLibrary.a है तो किसी भी तृतीय पक्ष अनुप्रयोग से लिंक किया जा सकता है जो MyFramework.framework का उपयोग करता है।
मैं -weak_library
का उपयोग कर रहा हूँ मेरा परीक्षण अनुप्रयोग शिकायत करता है कि स्थिर लिंकर MyLibrary के प्रतीक MyClass
भीतर MyFramework के ABCTracker.o प्रतीक ढूँढने में असमर्थ है:
Undefined symbols for architecture arm64:
"_OBJC_CLASS_$_MyClass", referenced from:
objc-class-ref in MyFramework(ABCTracker.o)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
सही तरीके से सेटअप कैसे कमजोर जोड़ने?
पूरा ब्योरा
सेट अप
- Xcode प्रोजेक्ट एक स्थिर मैक-ओ बाइनरी बनाता है और इसे एक स्थैतिक ढांचे में बंडल करता है। परिणामस्वरूप MyFramework.framework बंडल है
- अन्य परियोजना एक स्थैतिक Mach-O बाइनरी बनाता है और नतीजतन एक स्थैतिक लिब फ़ाइल libMyLibrary.a है हेडर के साथ MyLib.h
- libMyLibrary.a को MyFramework.framework लक्ष्य के बिल्ड चरणों से हटा दिया गया है> पुस्तकालयों के साथ लिंक बाइनरी ( जैसा कि यहां बताया गया है )। केवल MyLib.h लाइब्रेरी की कक्षाओं से लाइब्रेरी के एपीआई का उपयोग करने के लिए उपलब्ध है
- कोई भी बिट कोड न तो ढांचा में और न ही पुस्तकालय में भी प्रयोग किया जाता है
- MyFramework.framework , libMyLibrary.a और कस्टम एप्लिकेशन सभी उद्देश्य-सी में लिखे गए हैं
- MyLib एच केवल एक उद्देश्य सी मॉडल MyClass को परिभाषित करता है
- MyFramework.framework
MyClass
का उपयोग अपनी खुद की कक्षाABCTracker
है,NSClassFromString(@"MyClass") == NULL
रनटाइम के दौरान प्रतीकों की उपलब्धता की जांच करना, उदा।NSClassFromString(@"MyClass") == NULL
MyFramework लक्ष्य से बिल्ड सेटिंग्स से मैंने
Other Librarian Flags
औरOther Linker Flags
को एक ही मान के लिए-weak_library MyLibrary
:OTHER_LDFLAGS = ( "-weak_library", MyLibrary, ); OTHER_LIBTOOLFLAGS = "-weak_library MyLibrary";
परिणाम
- MyFramework.framework ठीक बनाता है
निर्माण के बाद मैंने परिणामस्वरूप बाइनरी में प्रतीकों की जांच की और आउटपुट एएमटी (स्थैतिक पुस्तकालय से कोई चिह्न स्थिर फ्रेमवर्क बाइनरी में बनाया गया था):
$ otool -L MyFramework.framework/MyFramework | grep MyClass
इसके बावजूद, मेरे परीक्षण आवेदन जो कुछ भी MyLibrary से जुड़ा नहीं है,
ld
त्रुटि के साथ बनाता है:Undefined symbols for architecture arm64: "_OBJC_CLASS_$_MyClass", referenced from: objc-class-ref in MyFramework(ABCTracker.o) ld: symbol(s) not found for architecture arm64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
मुझसे यहां क्या गलत हो रहा है?
अन्य टिप्पणियां
MyFramework लक्ष्य में मैं Other Librarian Flags
और Other Linker Flags
उसी मूल्य के सेट करता हूं:
-
-lMyLibrary
परिणाम:otool
दिखाता है कि पुस्तकालय के प्रतीकों को फ्रेमवर्क (अपेक्षित) में बनाया गया है -
-weak-lMyLibrary
परिणामlMyLibrary
के समान है (क्या यह अपेक्षित है?)
मेरे ऐप्लिकेशन लक्ष्य में मैं Other Linker Flags
को -force_load MyLibrary
को -force_load MyLibrary
सेट कर देता -force_load MyLibrary
। परिणाम: लिंकर त्रुटि थोड़ा बदलता है:
ld: file not found: MyClass
clang: error: linker command failed with exit code 1 (use -v to see invocation)