iOS 정적 라이브러리 링크 및 로드

2456 단어
인용: iOS 정적 라이브러리의 링크와 불러오는 것을 연구하는 것은 이 문제에서 비롯된 것이다. SDK, , duplicate symbol? 한동안 이해할 수 없다. 이치에 따라duplicate symbol이 나타나면 코드에 중복 정의된 부분이 있어야 하는데 왜 실제 컴퓨터가 ok를 하는지 설명할 수 없다. 설마 실제 컴퓨터가 일부 코드를 차단했단 말인가?이러한 의문과 추측을 가지고 다음과 같은 실험을 진행하다

실험


실천이야말로 진리를 검증하는 유일한 표준이다
  • Demo
  • Testlib1

    void hello() {
    printf("Testlib1: hello
    ");
    }
    void hello2() {
    printf("Testlib1: hello1
    ");
    }
  • Testlib2

    void hello() {
    printf("Testlib2: hello
    ");
    }
    void hello2() {
    printf("Testlib2: hello2
    ");
    }


  • PS: 지금까지 DEMO 프로젝트 프레임워크 테스트, Demo 메인 프로젝트, 정적 라이브러리 프로젝트 2개 포함: Testlib1, Testlib2
    | 번호 | CPU 아키텍처 | 링크 ID | 라이브러리 링크 순서 | 테스트 코드 | Symbol | 출력 | 참고 |: --|: --| | arm64 | 빈 | Testlib1.frameworkTestlib2.framework|hello()|T _helloT _hello1|Testlib1: hello|원시|2|arm64|공|Testlib2.frameworkTestlib1.framework|hello()|T _helloT _hello2|Testlib2: hello|라이브러리 링크 순서 조정 |3|arm64|공|Testlib1.frameworkTestlib2.framework|hello();hello1()|T _helloT _hello1|Testlib1: hello;Testlib 1: hello1 | 인쇄 hello1 | 4 |arm64 | 빈 | Testlib 1.frameworkTestlib2.framework|hello();hello2()|T _helloT _hello1T _hello2|Testlib2: hello;Testlib2: hello2 | 인쇄 hello2 | 5 |arm64 | -allload|Testlib1.frameworkTestlib2.framework|hello();hello2() | 오류 보고: duplicate symbolhello|| 링크 ID + 인쇄 hello2 |11|x8664|비어 있음|Testlib1.frameworkTestlib2.framework|hello()|T _helloT _hello1|Testlib1: hello|시뮬레이터 |12|x8664|비어 있음|Testlib2.frameworkTestlib1.framework|hello()|T _helloT _hello2|Testlib2: hello|시뮬레이터+라이브러리 링크 순서 조정 |13|x8664|비어 있음|Testlib1.frameworkTestlib2.framework|hello();hello1()|T _helloT _hello1|Testlib1: hello;Testlib1: hello1 | 시뮬레이터 + 인쇄 hello1 | 14 | x8664|비어 있음|Testlib1.frameworkTestlib2.framework|hello();hello2() | 오류 보고: duplicate symbolhello|| 시뮬레이터 + 인쇄 hello2

    결론

  • 라이브러리 불러오는 것은 설정된 순서에 따라 불러오는 것입니다. 호출할 인터페이스가 모두 정의된 것을 발견하면 계속 불러오지 않습니다. 그렇지 않으면 계속 불러옵니다(1, 2, 3에 따라)
  • 후자가 불러오는 인터페이스는 앞 라이브러리의 인터페이스를 덮어쓴다(4에 따라)
  • 시뮬레이터에서 중복 정의를 허용하지 않습니다(14에 따라)
  • -all_load에서 인터페이스 재정의를 허용하지 않습니다(5에 따라)
  • 총결산


    상기 결론을 통해 SDK, , duplicate symbol? 더 잘 설명할 수 있다. 물론 상기 테스트는 XCode 8.0과 아이폰 5s 10.0.1에서 진행되었다.나는 공식적인 설명을 찾지 못했다. 만약 어떤 어린이신발이 앱 문서를 찾았다면 나에게 알려줄 수 있다.

    좋은 웹페이지 즐겨찾기