ios - 임포트 - 정적 연결



-weak_library를 통해 정적 라이브러리를 약하게 링크 (0)

문제:

정적 라이브러리 (Obj-C)를 약하게 링크 할 수 있습니까?

짧은 세부 정보

내 사용자 정의 정적 프레임 워크 ( MyFramework.framework )가 내 다른 사용자 정의 정적 라이브러리 ( libMyLibrary.a )를 약하게 연결하려고합니다.

libMyLibrary.a 뒤에있는 기능은 선택 사항이며 MyFramework.framework 를 사용하는 타사 응용 프로그램과 링크되는 libMyLibrary.a 가없는 경우 생략 할 수 있습니다.

-weak_library 사용 -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 바이너리를 만들고 결과는 헤더 MyLib.h 가있는 정적 lib 파일 libMyLibrary.a 입니다.
  • libMyLibrary.aMyFramework.framework 타겟의 빌드 단계 > 라이브러리와 이진 파일 링크 ( 여기에 제시된대로 )에서 제거되었습니다. MyLib.h 만이 프레임 워크의 클래스에서 라이브러리의 API를 사용할 수 있습니다.
  • 어떤 비트 코드도 프레임 워크 나 라이브러리에서 사용되지 않습니다.
  • MyFramework.framework , libMyLibrary.a 및 사용자 정의 응용 프로그램은 모두 Objective-C로 작성되었습니다.
  • MyLib.h 는 하나의 Objective-C 클래스 MyClass 정의합니다.
  • MyFramework.framework 는 자체 클래스 ABCTracker 에서 MyClass 를 사용하여 런타임 중에 기호 가용성을 조건부로 검사합니다 NSClassFromString(@"MyClass") == NULL 예 : NSClassFromString(@"MyClass") == NULL
  • MyFramework 타겟의 Build Settings에서 Other Librarian FlagsOther Linker Flags 를 같은 값으로 설정했습니다. -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 FlagsOther Linker Flags 를 같은 값으로 설정합니다.

  • -lMyLibrary . 결과 : otool 은 라이브러리의 심볼이 프레임 워크에 내장되어 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