ios - link - xcode static library



Слабо связывать статическую библиотеку через-weak_library (0)

Вопрос:

Возможно ли слабо связать статическую библиотеку (Obj-C)?

Краткие сведения

Я хочу, чтобы моя пользовательская статическая структура ( MyFramework.framework ) слабо связывала мою другую статическую библиотеку ( libMyLibrary.a ).

Функциональность libMyLibrary.a является необязательной и может быть опущена, если нет ни одной библиотеки libMyLibrary.a , связанной каким-либо сторонним приложением, использующим MyFramework.framework .

Я использую -weak_library . В моем тестовом приложении жалуется, что статический компоновщик не может найти символ MyLibrary MyClass в символе 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 создает статический битовый файл Mach-O и объединяет его в статическую структуру. Результатом является пакет MyFramework.framework .
  • Другой проект создает статическую битовку Mach-O, и результатом является статический lib-файл libMyLibrary.a с заголовком MyLib.h
  • libMyLibrary.a удаляется из фаз сборки цели MyFramework.framework > Link Binary With Libraries ( как предлагается здесь ). Только MyLib.h доступен для использования API библиотеки из классов инфраструктуры
  • NO Биткод не используется ни в рамках, ни в библиотеке
  • MyFramework.framework , libMyLibrary.a и настраиваемое приложение написаны в Objective-C
  • MyLib.h определяет только один класс Objective-C MyClass
  • MyFramework.framework использует MyClass из своего собственного класса ABCTracker условно проверяет наличие символа во время выполнения, например NSClassFromString(@"MyClass") == NULL
  • Из настроек сборки MyFramework я установил Other Librarian Flags и Other Linker Flags -weak_library MyLibrary для того же значения -weak_library MyLibrary :

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

результат

  • MyFramework.framework строит ОК
  • После сборки я проверил символы в результирующем двоичном файле, а на выходе был 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 Flags и Other 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