임베디드 바이너리와 링크 된 프레임 워크의 차이점은 무엇입니까?


87

외부 프레임 워크를 사용할 때 Xcode에는 이제 Linked Frameworks 섹션 과 함께 임베디드 바이너리 가 있습니다 .

여기에 이미지 설명 입력

외부 프레임 워크를 다운로드하고 Finder-> Xcode로 드래그하면 프레임 워크가 연결된 프레임 워크 및 라이브러리 섹션에 배치됩니다.

Carthage로 라이브러리를 빌드 할 때 임베디드 바이너리 섹션 으로 드래그하는 것이 좋습니다 .

API가 어느 쪽이든 사용할 수있게됨에 따라 둘 다 연결 측면에서 작동하는 것 같습니다. 임베디드 바이너리 섹션에 프레임 워크를 추가하면 링크 된 프레임 워크 및 라이브러리 섹션 에도 자동으로 추가됩니다 .

그래서, 누가 옳습니까? 카르타고 또는 나머지 인터넷? Xcode 프로젝트에 외부 리소스를 포함하는 두 가지 옵션이있는 이유는 무엇입니까?


그리고 장치에서 테스트 할 때 작동합니까?
trojanfoe

@trojanfoe 예 그렇습니다.
Maxim Veksler 2015 년

1) 포함 된 바이너리 섹션에 있거나 2) 빌드 중에 프레임 워크를 App Bundle에 복사하는 빌드 단계가 있지 않는 한 말이되지 않습니다.
trojanfoe

2
Carthage는 OSX 응용 프로그램에 대해서만 "Embedded Binaries"로 드래그 할 것을 권장합니다. iOS의 경우 "연결된 프레임 워크 및 라이브러리"만 권장합니다.
Damnum

답변:


72
  1. 연결-프레임 워크에 정의 된 API를 사용하는 경우 프레임 워크를 연결해야합니다.

  2. 임베딩-이 프로세스는 추가 된 프레임 워크가 App Bundle 내에 임베드되도록하고 잠재적으로 앱과 확장 번들간에 코드를 공유하는 데 도움이됩니다. iOS에서 제공하는 프레임 워크는 기기에서 쉽게 사용할 수 있으므로 타사 프레임 워크 만 포함합니다. 임베딩하는 경우 Xcode가 빌드를 컴파일하고 생성 할 수 있도록 링크도 연결해야합니다. 앱이 기기에서 실행되면 필요에 따라 임베디드 프레임 워크가 메모리에로드됩니다.


1
"필요할 때"부분은 무엇을 의미합니까? 이는 임베디드 프레임 워크가 런타임 중에 필요할 때로드된다는 것을 의미합니까? 또한 동적 프레임 워크에 대한 링크가 언제 발생할 것이라고 생각하십니까?
bartosss

에 경우 우리의 필요가 embed이되지 link는? 그 반대? 그리고 왜?
allenlinli

나는 당신이 코드에서 직접 API를 사용하는 프레임 워크 만 연결하면된다고 생각한다. 내가 맞다면 애플리케이션 코드에서 참조되지 않는 전 이적 의존성은 그냥 포함되어야한다.
Werner Altewischer

15

바이너리를 포함하면 제품에 포함됩니다. 포함하지 않고 라이브러리 또는 프레임 워크 만 링크하는 경우 제품의 일부가 아닙니다.

그러나 iOS8에서는 모든 타사 프레임 워크가 "임베디드"되어야합니다. 다양한 프로그램간에 공유되는 프레임 워크조차도 모든 프로그램에 "내장"되어야합니다. 공유 위치의 장치에 설치된 경우 공유 위치에서 동일한 "내장"코드를 사용하는 다른 설치 프로세스는 기존 설치를 다시 사용할 수 있습니다. 이것은 iOS8에만 해당되며 iOS8 이전 및 iOS 세계 밖에서는이 답변이 정확하지 않을 수 있습니다.


2
"바이너리를 포함하면 사용자가 자신의 컴퓨터에 해당 항목을 설치하지 않은 경우 사용자를 위해 제품을 더 쉽게 설치할 수 있습니다."라이브러리가없는 경우 iOS가 아닌 OSX처럼 들립니다. 설치된 경우 (즉, 비표준) 앱이로드되지 않습니다.
trojanfoe

로드되지 않을뿐만 아니라 @trojanfoe, 거부되고 처음에 설치할 수 없습니다 (개발자이거나 엔터프라이즈 계정을 사용하지 않는 한 ...)
dogsgod

iOS 8부터 동적으로 연결된 프레임 워크가 가능합니다
Basti 2015 년

사용자가 앱을 설치하고 해당 앱에 동적으로 연결된 프레임 워크가 포함 된 경우 해당 프레임 워크를 자동으로 검색 할 수 있습니다. 그러나 이것은 사용자의 설치 과정에서 실패 할 수있는 추가 지점으로, 응용 프로그램을 종료하는 링크 편집 오류가 발생합니다. 따라서 대답이 iOS가 아닌 OS X에만 적용되어야하는 이유가 없습니다. 내 답변과 관련하여 개선의 여지가 있으면 더 구체적으로 알려주십시오. 또는 답변이 이미 정확하다고 생각되면 동료 개발자를 완전한 SO 멤버로 만들기 위해 해당 답변에
찬성 투표하십시오

내가 반대하는 답변에 대한 선택적 측면입니다. 프레임 워크가 타사 인 경우 App Bundle의 일부 여야합니다. 기간. 이는 OSX 앱에서도 마찬가지입니다 (특히 Mac App Store를 통해 배포되는 앱의 경우).
trojanfoe

0

Linking이에 대한 자세한 내용 Linker은 컴파일 타임 또는로드 / 런타임에 작동합니다. a 를 대상 바이너리에 Linker 복사 합니다 Library. 이후 Framework자율적는 Linker,이 경우, 발견에 대한 책임과 연결 Dynamic Framework내부 시스템 로더 경로 , 안쪽 또는 찾을 수 및 링크 번들 .

Embedding바이너리를 대상 바이너리로 복사하는 과정입니다. 결과적으로 내부에 위치합니다.

여기에서 더 많은 것을 읽으 십시오


-3

내 이해에 따르면 임베디드 바이너리에는 iOS 8 이상에서 사용할 수있는 동적 프레임 워크 만 포함됩니다. 그렇지 않으면 정적 프레임 워크 만 연결할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.