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)




static-libraries