xcode4의 프레임 워크와 정적 라이브러리의 차이점 및 호출 방법


133

나는 xcode와 objective-c를 처음 접했습니다. 매우 기본적인 질문을하고 싶습니다.

프로젝트 설정에서 "바이너리를 라이브러리에 링크"할 때 작업 공간의 다른 프로젝트에서 가져온 프레임 워크와 라이브러리에 차이가 있음을 알았습니다.

첫 번째 질문, 왜 프레임 워크가 있습니까? 그리고 왜 도서관이 있습니까? 내 라이브러리가 프레임 워크가 될 수 없습니까?

그런 다음 .h 파일에서 가져온 정적 라이브러리에서 클래스를 어떻게 호출 할 수 있습니까?

접두사가 있어야한다고 생각하지만 찾을 수 없습니다. "ProjName / Myclass.h"도 작동하지 않습니다.

최대한 구체적으로 작성하십시오.

감사


기본적인 질문은 아닙니다
Masih

답변:


140

프레임 워크가 정적 라이브러리에 비해 가장 큰 장점은 컴파일 된 라이브러리 바이너리 및 관련 헤더를 패키징하는 깔끔한 방법으로 작동한다는 것입니다. Foundation 및 UIKit과 같은 SDK의 내장 프레임 워크와 같이 프로젝트에 드롭 할 수 있으며 대부분의 경우 작동해야합니다.

대부분의 프레임 워크에는 동적 라이브러리가 포함되어 있습니다. Mac Framework 템플릿을 사용하여 Xcode에서 생성 된 프레임 워크는 동적 라이브러리를 생성합니다. iPhone은 동적 프레임 워크를 지원하지 않기 때문에 재사용 가능한 iOS 코드 라이브러리가 정적 라이브러리로 배포되는 것이 일반적이되었습니다.

정적 라이브러리는 괜찮지 만 사용자 측에서 약간의 추가 작업이 필요합니다. 프로젝트를 라이브러리에 연결하고 헤더 파일을 프로젝트에 복사해야합니다. 또는 빌드 설정에서 적절한 헤더 검색 경로를 설정하여 어딘가에 참조해야합니다.

요약하자면, 제 의견은 라이브러리를 배포하는 가장 좋은 방법은 프레임 워크라는 것입니다. iOS 용 "정적"프레임 워크를 만들려면 기본적으로 일반 프레임 워크를 사용하고 바이너리를 컴파일 된 정적 라이브러리로 바꿀 수 있습니다. 이것이 내 라이브러리 중 하나를 배포하는 방법입니다. Resty 를 배포하는 방법이며 앞으로 라이브러리를 배포 할 방법입니다.

해당 프로젝트에서 제공된 Rakefile을보고 싶을 수도 있습니다 (알지 못하는 경우 Rake는 Ruby의 Make와 동일합니다). 프로젝트를 컴파일하는 데 필요한 몇 가지 작업이 있습니다.xcodebuild ) iOS의 정적 프레임 워크로 패키징 있습니다. 이것이 유용하다는 것을 알게 될 것입니다.

또는 이러한 Xcode 4 템플릿 을 사용하여 iOS 프레임 워크를 만들 수도 있습니다 .

2013 년 12 월 9 일 업데이트 : 이것은 대중적인 답변이므로 라이브러리 배포에 대한 첫 번째 선택이 변경되었다고 편집하려고 생각했습니다. 소비자 또는 생산자로서 타사 라이브러리에 대한 첫 번째 선택은 CocoaPods입니다. CocoaPods를 사용하여 라이브러리를 배포하고 대체 옵션으로 헤더가있는 미리 컴파일 된 정적 라이브러리를 제공합니다.


1
따라서 라이브러리는 정적 및 동적 일 수 있으며 프레임 워크는 단순히 동적 또는 정적 일 수있는 라이브러리 그룹 일뿐입니다.
Tony

Xcode 프레임 워크 대상을 사용하면 헤더를 복사 할 수는 있지만 리소스를 묶을 수는 없습니다. 분산 정적 라이브러리에도 헤더가 포함될 수 있습니까?
Tony

후속 질문 : 디버그 또는 배포를 사용하여 프레임 워크를 작성한 경우 중요합니까? 그렇지 않으면 배포판의 설치 공간이 더 작습니다.
Aldrich Co

2
@GoRoS 네, 그렇습니다. 사실 방금 CocoaPods를 사용하여 개인 SDK를 사용할 수 있도록 클라이언트에서 일부 작업을 수행했습니다. 트릭은 컴파일 된 정적 라이브러리, 헤더 및 podspec이있는 공개 리포지토리와 소스가있는 개인 리포지토리를 갖는 것입니다. 이상적으로는 개인 저장소를 확인하고 공용 저장소를 컴파일 및 업데이트하여 두 가지를 동기화하여 유지하는 일종의 CI / 자동화가 필요합니다. 태그를 사용하여 공개 리포지토리 (그리고 아마도 개인 리포지토리에서도 공개 버전을 만드는 데 사용 된 소스 커밋을 알 수 있음)에서 실제 버전의 릴리스에 태그를 지정하십시오.
Luke Redpath

1
CI로 솔루션을 보내는 @LukeRedpath는 매우 이상적입니다 ... 어떻게 자습서를 사용하여 좋은 기사 / 블로그에 대해 설정하는 방법을 알고 있습니까? Jenkins와 이상적
micromanc3r

19

기본적으로 프레임 워크는 라이브러리이며이를 사용하기위한 편리한 메커니즘을 제공합니다. 프레임 워크를 "내부"로 살펴보면 정적 라이브러리와 헤더 파일 (메타 데이터가있는 일부 폴더 구조)이 들어있는 디렉토리 일뿐입니다.

자체 프레임 워크를 만들려면 "정적 라이브러리"를 만들어 특정 방식으로 압축해야합니다. 보다 이 질문을

일반적으로 플랫폼의 framworks는 "기존 프레임 워크에"고유 코드를 추가하는 재사용 가능한 동작에 사용됩니다. 특정 기능을 원한다면 라이브러리 (예 : three20)를 사용하여 배포 가능한 앱에 패키징 할 수 있습니다


1
프레임 워크에 정적 라이브러리가 포함되어야한다는 요구 사항은 없습니다. 실제로 Mac OS X에서는 대부분의 프레임 워크에 정적 라이브러리가 없습니다. 대신 동적 라이브러리가 있습니다.

고맙지 만 분명하지만 .m 파일 내에서 정적 라이브러리의 클래스를 어떻게 호출 할 수 있습니까? "라이브러리가있는 링크 바이너리"를 추가하는 것 외에도 #import "MyClass.h"를 호출하는 것으로 충분합니까?
Leonardo

@Bavarious 당신 말이 맞아요 "라이브러리"만 써야 했어요 ^^; 여전히 라이브러리가없는 거의 모든 프레임 워크가 있습니다. 대부분의 경우 컴파일을위한 프레임 워크와 링크하고 라이브러리는 대상 시스템에 있습니다. 이것은 다시이 행동 대 기능성입니다
마틴 울리히

@ 레오나르도 네, 기본적으로 당신이해야 할 일입니다. .h 파일이 경로의 어딘가에 있는지 확인하십시오. libaray의 XCode 프로젝트가있는 경우 프로젝트와 해당 대상을 종속성으로 포함하여 경로에 더 많은 디버깅 기능과 .h 파일을 얻을 수 있습니다.
Martin Ullrich

나는 혼란스러워, 나는 당신의 대답이 옳았지만, "-1"?!?!?! 둘째, 라이브러리는 작업 공간의 일부이며 기본 프로젝트에서 올바르게 연결됩니다. 그러나 응용 프로그램을 만들 때 여전히 '#import "MyClass.h"줄에 "클래스를 찾을 수 없습니다"라는 메시지가 표시됩니다. 나는 그것이 작동하게하는 트릭이 있다는 것을 알고있다.
Leonardo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.