Разница между фреймворком и статической библиотекой в ​​xcode4 и как их называть


133

Я совершенно новичок в Xcode и Objective-C. Я хочу задать очень простой вопрос.

Я видел, что при «связывании двоичного файла с библиотеками» в настройках проекта есть различия в фреймворке и библиотеках, импортированных из других проектов в рабочей области.

Первый вопрос, почему есть рамки? И почему там библиотека? Моя библиотека не может быть фреймворком?

И затем, из файла .h , как я могу вызвать классы из моей импортированной статической библиотеки?

Я предполагаю, что должен быть префикс, но я не смог его найти. Ни «ProjName / Myclass.h» не работают.

Пожалуйста, будьте как можно точнее.

Спасибо


Не основной вопрос
— Масих

Ответы:


140

Самым большим преимуществом фреймворка перед статическими библиотеками является то, что они действуют как аккуратный способ упаковки скомпилированного двоичного файла библиотеки и любых связанных заголовков. Они могут быть добавлены в ваш проект (так же, как встроенные фреймворки SDK, такие как Foundation и UIKit), и они должны просто работать (большую часть времени).

Большинство фреймворков содержат динамические библиотеки; рамки, созданные в Xcode с использованием шаблона Mac Framework, создадут динамическую библиотеку. IPhone не поддерживает динамические фреймворки, поэтому многоразовые библиотеки кода iOS стали распространяться в виде статических библиотек.

Статические библиотеки хороши, но они требуют немного дополнительной работы со стороны пользователя. Вы должны связать свой проект с библиотекой, и вам нужно скопировать файлы заголовков в ваш проект или сослаться на них где-нибудь, указав соответствующие пути поиска заголовков в настройках сборки.

Итак, в общем, я считаю, что лучший способ распространения вашей библиотеки - это фреймворк. Чтобы создать «статический» фреймворк для iOS, вы можете по существу взять обычный фреймворк и заменить двоичный файл скомпилированной статической библиотекой. Вот как я распространяю одну из моих библиотек, Resty и именно так я намерен распространять свои библиотеки в будущем.

Вы можете посмотреть Rakefile, поставляемый в этом проекте (если вы не знаете, Rake - это Ruby-эквивалент Make). У меня есть несколько задач для компиляции моего проекта (использования xcodebuild) и упаковки их в качестве статической среды для iOS. Вы найдете это полезным.

Кроме того, вы можете использовать эти шаблоны Xcode 4 для создания платформы iOS.

Обновление 9 декабря 2013 года : это популярный ответ, поэтому я решил отредактировать его, сказав, что мой первый выбор для распространения библиотеки изменился. Мой первый выбор для любой сторонней библиотеки в качестве потребителя или производителя - CocoaPods. Я распространяю свои библиотеки с помощью CocoaPods и предлагаю предварительно скомпилированную статическую библиотеку с заголовками в качестве запасного варианта.


1
Таким образом, библиотеки могут быть статическими и динамическими, а фреймворки - это просто группа библиотек, которые также могут быть динамическими или статическими, это правильное понимание?
— Тони

Похоже, что цель платформы Xcode также позволяет копировать заголовки, но не связывать ресурсы. Могут ли распределенные статические библиотеки содержать заголовки?
— Тони

Последующий вопрос: имеет ли значение, если вы построили фреймворк с использованием Debug или Distribution? Потому что в противном случае дистрибуция имеет меньшую площадь.
— Aldrich Co

2
@GoRoS да, я делаю; на самом деле я только что поработал для клиента, сделав доступным их частный SDK с помощью CocoaPods. Хитрость заключается в том, чтобы иметь общедоступное репо со скомпилированной статической библиотекой, заголовками и podspec, указывающими на это, и частное репо с вашим источником. В идеале у вас должен быть какой-то CI / автоматизация для проверки вашего частного репо, компиляции и обновления публичного репо, синхронизируя их. Используйте теги, чтобы пометить актуальные выпуски с поддержкой версий в общедоступном репо (и, возможно, в частном репо, чтобы вы знали, какой исходный коммит использовался для создания общедоступного выпуска).
— Люк Редпат

1
@LukeRedpath ваше решение с CI звучит довольно идеально ... знаете ли вы о какой-нибудь хорошей статье / блоге с учебником, как его настроить? Идеально с Дженкинсом
— micromanc3r

19

В основном, фреймворки являются библиотеками и предоставляют удобный механизм для работы с ними. Если вы посмотрите «внутрь» фреймворка, это просто каталог, содержащий статическую библиотеку и файлы заголовков (в некоторой структуре папок с метаданными).

Если вы хотите создать свой собственный фреймворк, вы должны создать «статическую библиотеку» и упаковать ее особым образом. увидеть этот вопрос

В общем, framworks на платформах используется для многоразового поведения, когда вы добавляете свой собственный код «в существующую среду». если вы хотите иметь определенную функциональность, вы можете использовать библиотеку (например, three20) и упаковать ее в свой дистрибутив приложения


1
Обратите внимание, что нет требования, чтобы фреймворк содержал статическую библиотеку. Фактически, в Mac OS X большинство фреймворков не содержат статических библиотек - вместо этого они содержат динамические библиотеки.

спасибо, это понятно, но как я могу вызвать класс в статической библиотеке из файла .m? Достаточно ли вызвать #import "MyClass.h", кроме добавления в "связать двоичные файлы с библиотеками"?
— Леонардо

@Bavarious, вы правы, я должен был написать только "библиотеки" ^^; тем не менее, существует почти любая инфраструктура без библиотек - в большинстве случаев вы ссылаетесь на платформу для компиляции, и библиотека присутствует в целевой системе. это опять-таки такая штука с поведением и функциональностью
— Мартин Уллрих,

@ Леонардо, да, в основном это то, что ты должен сделать. Просто убедитесь, что файлы .h находятся где-то на вашем пути. Если у вас есть XCode-проект библиотеки, вы можете включить проект и его цель в качестве зависимости, чтобы получить больше возможностей отладки и .h-файлов на своем пути
— Martin Ullrich

Я в замешательстве, я думал, что ваш ответ был правильным, но я увидел, что он помечен как "-1"?!?!?! Во-вторых, библиотека является частью рабочей области и правильно связана с основным проектом. Но я все еще получаю сообщение «класс не найден» в строке «#import« MyClass.h »» при создании приложения. Я знаю, что есть трюк, чтобы заставить его работать.
— Леонардо
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.