1

프로젝트에서 정적 라이브러리를 사용하려고합니다. 정적 라이브러리는 여러 프레임 워크에 따라 달라집니다. CoreData, CFNetwork, AddressBook 등XCode에서 정적 라이브러리를 사용할 때 라이브러리와 이진 파일을 두 번 연결해야합니다.

정적 라이브러리도 범주를 사용하므로 주 프로젝트의 "기타 링커 설정"에서 -all_load 링커 옵션을 사용해야합니다. 이 기능을 활성화하면 내 정적 프로젝트 (CoreData, CFNetwork, AddressBook 등)와 동일한 프레임 워크와 연결되지 않는 주 프로젝트와 관련된 120 개의 오류가 발생합니다.

개발자가 정적 라이브러리를 사용하고 싶지만 라이브러리가 링크 된 모든 프레임 워크에 링크해야하는 것은 매우 불편합니다. 이 프로세스를 자동화하는 방법은 없으므로 기본 프로젝트가 정적 라이브러리에 연결된 모든 프레임 워크에 자동으로 연결됩니다.

저는 XCode 4.4를 사용하고 있습니다.

편집 :

StaticLibrary.xcodeproj 
    - AFNetworking 
     - files... 
    - CoreData 
     - categories for NSManagedObjectContext, for convenience 
    - AddressBook 
     - convenience methods for working with contacts 

이 프로젝트의 목표는 빌드 페이즈> 링크 바이너리 라이브러리에서 필요한 프레임 워크에 연결되어 있습니다 : 더 명확하게하기 위해, 나는 다음 있습니다. 여기에는 CoreData.framework, AddressBook.framework 등이 포함됩니다.

이제이 라이브러리를 다른 프로젝트에 추가 할 수 있습니다. 사실,이 라이브러리를 내가 작성한 모든 새 프로젝트에 추가하고 싶습니다. 그래서 필자가 작성한 편의 기능/카테고리에 항상 쉽게 액세스 할 수 있습니다. 그래서 : 내 프로젝트에 라이브러리를 추가 한 다음 .a 파일을 Build Phases> Link with Binary With Link (내 주요 프로젝트)에 추가하십시오. 나는 또한 내가 알고있는 모든 것을 필요로한다 (의견을 보라).

기본 프로젝트가 이제 라이브러리에 연결되어 모든 라이브러리 링크를 상속하므로 주 프로젝트가 현재 CoreData.framework, AddressBook.framework 등에도 연결됩니다.

무슨 일이 일어나는가? 메인 프로젝트는 라이브러리에 필요한 것과 연결되지 않았기 때문에 오류가 발생합니다.

정적 라이브러리에서 기본 프로젝트로 링크 된 프레임 워크를 자동으로 추가하는 방법이 있습니까? 아니면 라이브러리를 CoreDataStaticLibrary 등으로 분할하고 개발자가 CoreData.framework와 정적을 추가해야합니다. 라이브러리를 매번 프로젝트 대상으로?

+0

저는 Xcode가 모든 소스를 실행 파일에 연결하려고 시도하지만 정적 라이브러리가 아니라고 생각합니다. 적절한 설정을 사용 했습니까? –

+0

xcodeproj 라이브러리를 내 메인 프로젝트로 끌었습니다. 내 주요 프로젝트에서 "Target Dependencies"에 라이브러리를 추가했습니다. 내 주요 프로젝트의 "라이브러리와 이진 링크"라이브러리에 .a 파일을 추가했습니다. 기본 프로젝트의 빌드 설정에서 기타 링크 설정에 "-all_load"를 추가했습니다. 재귀 적으로 메인 프로젝트의 헤더 검색 경로를 라이브러리 디렉토리로 변경했습니다. 내가 놓친 게 있니? –

+0

필자는 simmilar 문제가 있었고 havent는 all_load 플래그를 사용하는 방법을 찾았습니다. 대신 -force_load 플래그를 사용하거나 IOS 범용 프레임 워크에 범주를 넣는 것이 좋습니다. [link] (https://github.com/kstenerud/iOS-Universal-Framework). -force_load로 할 수 있다면 아마 더 나은 해결책 일 것입니다. –

답변

1

라이브러리에 범주 만 있으면 -all_load 만 있으면됩니다. 그렇지 않은 경우 -ObjC을 사용할 수 있습니다. 그것은 내가 사용하는 것입니다.

또한 정적 라이브러리를 만들 때 컴파일 된 개체 모듈의 아카이브 만 만들면됩니다. 라이브러리에서 외부 종속성이 해결되지 않습니다. 사실,이 코드를 여러 개의 객체 코드 파일 모음으로 생각하면됩니다.

마지막으로 실행 파일을 링크하면 정적 라이브러리에 미리 컴파일 된 코드의 아카이브와 함께 모든 컴파일 된 코드가 링크됩니다. 링커는 모든 심볼을 해결할 것으로 예상하므로 모든 심볼을 완전히 해결하는 데 필요한 모든 라이브러리 (프레임 워크)를 찾을 위치를 지정해야합니다.

XCode가 정적 라이브러리 하위 프로젝트를보고 해당 프로젝트의 프레임 워크 종속성을 추출하여 최종 프로젝트의 링커 호출에 추가 할 수 있어야합니까? 확실한. 그러나, 나는 그것이 자동적으로 일어나는 방법을 알고 있지 않다.

원하는 경우 라이브러리 용 podfile을 만들고 CocoaPods을 사용하여 프로젝트 종속성을 관리 할 수 ​​있습니다.

+0

Shame XCode는 프레임 워크 의존성을 제거 할 수 없습니다. 그게 내가 찾고 있던 ... 오 잘. 그것이 작동하지 않는다는 것을 확인해 주셔서 감사합니다. –

0

동일한 기호를 여러 번 사용하면 문제가 발생합니다. 나는 여러 번 같은 문제에 빠졌고 해결책은 기본적으로 "-all_load"플래그가 무엇을하는지 이해하는 것입니다.이 질문에서 꽤 잘 설명되어 있습니다 : What does the all load linked flag do

그런 식으로 도서관. 이 프레임 워크는 동적으로 링크되어 있기 때문에 실제로 정적 라이브러리에 속하지 않으므로 여기서는 해당 프레임 워크를 가리키는 참조 만 있습니다.

해당 라이브러리의 사용자는 제대로 작동하도록 필요한 프레임 워크를 추가해야합니다. 즉, 라이브러리를 이러한 프레임 워크에 링크 할 필요가 없습니다 (단지 의미가 없습니다). 라이브러리를 사용하려는 프로젝트에 라이브러리를 추가하기 만하면됩니다. (어떻게 완료되었는지 보려면 Restkit을보십시오).

또한 "all_load"플래그를 없애고 "force_load/path/to/the/library"로 바꾸려고합니다. all_load는 라이브러리에 범주 만 포함되어있는 경우에만 필요합니다. 모든).

우리가 어떻게 행복하게 코딩되는지 알려주세요!