ios - xcode add static library



弱鏈接靜態庫通過-weak_library (0)

題:

弱鏈接靜態庫(Obj-C)有可能嗎?

短細節

我希望我的自定義靜態框架( MyFramework.framework )弱鏈接我的其他自定義靜態庫( libMyLibrary.a )。

libMyLibrary.a背後的功能是可選的,如果沒有 libMyLibrary.a被任何使用MyFramework.framework的第三方應用程序鏈接,可以省略。

我正在使用-weak_library 。 我的測試應用程序抱怨靜態連接器無法在MyFrameworkABCTracker.o符號中找到MyLibrary的符號MyClass

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項目構建一個靜態的Mach-O二進製文件並將其捆綁到一個靜態框架中。 結果是MyFramework.framework包。
  • 其他項目生成一個靜態Mach-O二進製文件,結果是一個靜態lib文件libMyLibrary.a,帶有一個頭文件MyLib.h
  • libMyLibrary.aMyFramework.framework目標的Build Phases > Link Binary With Libraries中移除( 如此處所示 )。 只有MyLib.h可以從框架的類中使用庫的API
  • NO Bitcode既不用在框架中,也不用在庫中
  • MyFramework.frameworklibMyLibrary.a和自定義應用程序都是用Objective-C編寫的
  • MyLib.h只定義了一個Objective-C類MyClass
  • MyFramework.framework使用MyClass從它自己的類ABCTracker有條件地檢查運行時的符號可用性,例如NSClassFromString(@"MyClass") == NULL
  • MyFramework目標的構建設置我已經設置Other Librarian FlagsOther Linker Flags為相同的值-weak_library MyLibrary

    OTHER_LDFLAGS = (
        "-weak_library",
        MyLibrary,
    );
    OTHER_LIBTOOLFLAGS = "-weak_library MyLibrary";

結果

  • MyFramework.framework生成OK
  • 編譯後,我已經檢查了生成的二進製文件中的符號,輸出是emty(靜態庫中沒有符號被構建到靜態框架二進製文件中):

    $ 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 FlagsOther Linker Flags設置為相同的值:

  • -lMyLibrary 。 結果: otool顯示庫的符號被構建到框架中(預期)。
  • -weak-lMyLibrary 。 結果與lMyLibrary相同(是否預期?)

我的應用程序目標中,我將Other Linker Flags設置為-force_load MyLibrary 。 結果:鏈接器錯誤稍微改變:

ld: file not found: MyClass
clang: error: linker command failed with exit code 1 (use -v to see invocation)




static-libraries